洛谷 P1731 生日蛋糕
/*洛谷 1731 生日蛋糕 傻傻的-1 T成了傻逼*/ #include<cstdio> #include<iostream> #include<cmath> #define inf 1e17 #define maxn 20 #define ll long long using namespace std; ll n,m,ans=inf,a[maxn],b[maxn]; void Dfs(ll now,ll V,ll S,ll h,ll r){ ll res=m-now+1,r1=0; if(V>n||V+a[res]>n||S+b[res]>=ans)return; if(S+(n-V)/r*2>=ans)return; if(V+res*(h-1)*(r-1)*(r-1)<n)return; if(now==m+1){ if(V==n)ans=S;return; } ll x,y;y=max(res,(ll)1); for(ll i=h-1;i>=y;i--){ ll x=min(r-1,(ll)sqrt((n-V-a[res-1])/i)+1); for(ll j=x;j>=y;j--){ if(now==1)r1=j; Dfs(now+1,V+i*j*j,S+i*j*2+r1*r1,i,j); } } } int main() { cin>>n>>m; for(ll i=1;i<=m;i++){ a[i]=a[i-1]+i*i*i; b[i]=b[i-1]+2*i*i; } Dfs(1,0,0,n+1,n+1); if(ans==inf)ans=0; cout<<ans<<endl; return 0; }