比赛 2025.10.18 评测结果 AAAAAAAAAA
题目名称 生日蛋糕 最终得分 100
用户昵称 会挽弯弓满月 运行时间 0.044 s
代码语言 C++ 内存使用 3.86 MiB
提交时间 2025-10-18 11:46:35
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=30,inf=1e9+7;
int n,m;
int ans;
int mins[N],minv[N];
void dfs(int dep,int v,int s,int lr,int lh){
	if(dep==0){
		if(v==n) ans=min(ans,s);
		return;
	}
	if(s+mins[dep-1]>=ans) return;
	if(v+minv[dep-1]>n) return;
	if(2*(n-v)/lr+s>=ans) return;
	int nowv,nows,maxh,ss,sv;
	for(int r=lr-1;r>=dep;r--){
		sv=n-minv[dep-1]-v;
		ss=2*sv/r;
		maxh=min(lh-1,ss/r);
		for(int h=maxh;h>=dep;h--){
			nowv=r*r*h;
			nows=2*r*h;
			if(dep==m) nows+=r*r;
			dfs(dep-1,v+nowv,s+nows,r,h);
		}
	}
	return;
}
int main(){
	freopen("cake.in","r",stdin);
	freopen("cake.out","w",stdout);
	scanf("%d%d",&n,&m);
	ans=inf;
	for(int i=1;i<=m;i++){
		mins[i]=mins[i-1]+2*i*i;
		minv[i]=minv[i-1]+i*i*i;
	}
	dfs(m,0,0,n,n);
	if(ans==inf) ans=0;
	printf("%d",ans);
	return 0;
}