洛谷 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;
}
原文地址:https://www.cnblogs.com/yanlifneg/p/6054373.html