加强版求助
查看原帖
加强版求助
750869
Michael_Liu楼主2023/10/8 19:22

感觉能剪的枝已经剪完了,加强版的#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;
}
2023/10/8 19:22
加载中...