BZOJ 1053 [HAOI2007]反素数ant 搜索
爆搜啊~
利用约数个数公式求答案。
相当于找约数最多的数,个数相同取较小的。
有一点需要注意:分解质因数,较小的数的指数一定大于等于较大的数的指数(显然的么~要么把大的数换成小的一定更优~)
这样一来,可以确定质因数最多十个,剩下就是暴力了~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 7 using namespace std; 8 9 long long prime[14]={0,2,3,5,7,11,13,17,19,23,29,31,37}; 10 long long ans,num,n; 11 12 inline void dfs(int now,long long product,long long cs,long long lastcs,long long res) 13 //当前数,当前乘积,当前数出现次数,上一个数出现次数,约数个数 14 { 15 //printf("%d %lld %d %d %d\n",now,product,cs,lastcs,res); 16 if(ans==res*(cs+1)&&product<num) num=product; 17 if(res*(cs+1)>ans) {ans=res*(cs+1);num=product;} 18 if(cs+1<=lastcs&&product*prime[now]<=n) dfs(now,product*prime[now],cs+1,lastcs,res); 19 for(int i=now+1;i<=12;i++) 20 if(product*prime[i]<=n) dfs(i,product*prime[i],1,cs,res*(cs+1)); 21 } 22 23 inline void go() 24 { 25 dfs(1,1,0,100,1); 26 printf("%lld\n",num); 27 } 28 29 int main() 30 { 31 scanf("%lld",&n); 32 go(); 33 return 0; 34 }
没有人能阻止我前进的步伐,除了我自己!