能用的剪枝都用了,本机#2 0.6s,怀疑被卡常,求调
#include <bits/stdc++.h>
using namespace std;
long long n,m,ans=99999999,mr[10000],mh[10000],t[16]={0,0,1,9,36,100,225,441,784,1296,2025,3025,4356,6084,8281,11025};
void dfs(long long now,long long sum,long long cnt)
{
if(sum>=n-t[m-now]&&now!=m)return;
if(cnt>=ans)return;
if(now==m)
{
if(sum==n)ans=min((int)ans,(int)cnt);
return;
}
for(long long i=mr[now]-1;i>=0;i--)
for(long long j=mh[now]-1;j>=0;j--)
{
long long v=i*i*j;
if(sum+v>n-t[m-now]||v<(n-sum)/(m-now)||i<(m-now)||j<(m-now))continue;
mr[now+1]=i;mh[now+1]=j;
if(now==0)cnt=i*i;
dfs(now+1,sum+i*i*j,cnt+2*i*j);
}
}
int main()
{
scanf("%d%d",&n,&m);
mr[0]=sqrt(n)+1;mh[0]=n;
dfs(0,0,0);
printf("%d",ans);
return 0;
}