BZOJ 1053 反素数 题解
引理1: 1~n中的最大反质数,就是1~n中约数个数最多的数中最小的一个(因为要严格保证g(x)>g(i));
引理2:1~n中任何数的不同因子不会超过10个,因为他们的乘积大于2,000,000,000;
引理3: 1~n中任何数的质因子的指数总和不超过30;
引理4: x的质因子是连续的若干个最小的质数,并且指数单调递减;
对于指数的排列我们只要深搜就可以找到方案,对于不同情况判断是否更新答案;
#include <bits/stdc++.h> using namespace std; long long n; long long ans=99999999999999; int a[15]={0,2,3,5,7,11,13,17,19,23,29,31}; inline long long KSM(long long a,long long b) { long long res=1; while(b){ if(b&1) res=res*a; a=a*a; b/=2; } return res; } long long cnt=-1; inline void dfs(int dep,int now,long long sum,long long num) { if(sum>n||sum<0){ return; } if(num>cnt){ ans=sum; cnt=num; } else if(num==cnt){ if(sum<ans) ans=sum; } if(dep>10){ return; } for(register int i=now;i>=1;i--){ dfs(dep+1,i,sum*KSM(a[dep],i),num*(i+1)); } } int main() { cin>>n; dfs(1,32,1,1); cout<<ans; }
众人皆醉我独醒,举世皆浊我独清