80分求调
查看原帖
80分求调
719405
Harry20111022楼主2025/1/20 10:40

WA on #2 #6 #2的输入是32768,应输出2888071057872000。但是我的程序输出的就是2888071057872000,luogu评测机告诉我错了

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int p[] = {0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
int n,f[20],g[20],a[100000],alen;
double mi = 114514;

void dfs(int r,double ans,int x){
//	cout << r << " " << ans << " " << x << endl;
	if((x >= 3 && f[x - 1] > f[x - 2]) || (f[x - 1] == 0 && x >= 2)){
		return;
	}
	if(x >= 17){
		return;
	}
	if(r == 1){
		if(ans < mi){
//			cout << mi << endl;
			mi = ans;
			for(int i = 1;i <= 29;i++){
				g[i] = f[i];
			}
		}
	}else{
		for(int i = 1;i <= sqrt(r);i++){
			if(r % i == 0){
				f[x] = i - 1;
				dfs(r / i,ans + (i - 1) * log(p[x]),x + 1);
				f[x] = r / i - 1;
				dfs(i,ans + (r / i - 1) * log(p[x]),x + 1);
				f[x] = 0;
			}
		}
	}
}

signed main(){
	cin >> n;
	
	dfs(n,0,1);
	
//	for(int i = 1;i <= 16;i++){
//		cout << g[i] << " ";
//	}
//	cout << endl;
	
	memset(a,0,sizeof(a));
	
	a[1] = 1;
	alen = 1;
	for(int i = 1;i <= 16;i++){
		for(int j = 1;j <= g[i];j++){
			for(int k = 1;k <= alen;k++){
				a[k] *= p[i];
			}
			for(int k = 1;k <= alen;k++){
				a[k + 1] += a[k] / 10;
				a[k] %= 10;
			}
			while(a[alen + 1] != 0){
				alen++;
				a[alen + 1] += a[alen] / 10;
				a[alen] %= 10;
			}
		}
	}
	
	for(int i = alen;i >= 1;i--){
		cout << a[i];
	}
	cout << endl;

	return 0;
}
2025/1/20 10:40
加载中...