【洛谷P1463】反素数
题目大意:给定 \(N < 2e9\),求不超过 N 的最大反素数。
题解:
引理1:不超过 2e9 的数的质因子分解中,最多有 10 个不同的质因子,且各个质因子的指数和不超过30。
引理2:题目要求的最大反素数,实际上是求不超过 N 的数中因子数最多的数的集合中最小的那个数。
引理3:通过引理 2 以及交换证明法可以得出,各个质因子指数必须单调递减。
代码如下
#include <bits/stdc++.h>
using namespace std;
int n,cnt[15];
long long ans,sum;
int p[11]={0,2,3,5,7,11,13,17,19,23,29};
void dfs(int now,long long val,long long sum0){
if(now==11){
if(sum0>sum||(sum0==sum&&val<ans))ans=val,sum=sum0;
return;
}
for(int i=0;i<=cnt[now-1];i++){
if(val>n)break;
cnt[now]=i;
dfs(now+1,val,sum0*(i+1));
val*=(long long)p[now];
}
}
void solve(){
ans=1e12,cnt[0]=0x3f3f3f3f;
scanf("%d",&n);
dfs(1,1,1);
printf("%lld\n",ans);
}
int main(){
solve();
return 0;
}