BZOJ 1053: [HAOI2007]反素数ant
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 4175 Solved: 2493
[Submit][Status][Discuss]
Description
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0
解题思路
做这道题首先要知道一个结论,首先,x可以被分解成若干个素数的乘积,x的约数就是这些素数的指数+1的乘积,我们还要优先选取质数较小指数较大的,所以考虑dfs。每次在不超过n的前提下搜索,如果约数更多或now更小则更新答案。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL long long
using namespace std;
LL n;
int prime[15]={0,2,3,5,7,11,13,17,19,23,29,31,33};
int sum;
LL ans;
inline void dfs(int k,LL now,int cnt,int last){
if(k==13){
if(now<=ans && cnt>=sum) {sum=cnt;ans=now;}
if(now>=ans && cnt>sum) {sum=cnt;ans=now;}
return;
}
int t=1;
for(register int i=0;i<=last;i++){
dfs(k+1,now*t,cnt*(i+1),i);
t*=prime[k];
if(now*t>n) break;
}
}
int main(){
scanf("%lld",&n);
dfs(1,1,1,20);
printf("%lld",ans);
return 0;
}