感觉能剪的枝已经剪完了,加强版的#5还是T了 记录
求优化或其他做法
#include <bits/stdc++.h>
#define ll long long
#define reg register
using namespace std;
const int N=1e5+10;
ll mins[N],minv[N];
ll n,m;
ll ans=1145141919810;
void dfs(ll now,ll v,ll s,ll lasth,ll lastr){
if(now==0){
if(v==n) ans=min(ans,s);
return;
}
if(s+2*(n-v)/lastr>=ans) return;
if(v+minv[now]>n) return;
if(s+mins[now]>=ans) return;
ll res=1ll*sqrt(n-v);
ll maxr=min(lastr-1,res);
for(reg int i=maxr;i>=now;--i){
if(now==m) s=i*i;
ll maxh=min(lasth-1,(n-v)/(i*i));
for(reg int j=maxh;j>=now;--j){
dfs(now-1,v+i*i*j,s+2*i*j,j,i);
}
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(reg int i=1;i<=m;++i){
mins[i]=mins[i-1]+2*i*i;
minv[i]=minv[i-1]+i*i*i;
}
ll Maxr=sqrt(n);
dfs(m,0,0,n/(m*m),Maxr);
if(ans==1145141919810) cout<<-1;
else cout<<ans;
return 0;
}