1053: [HAOI2007]反素数ant
Description
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x
,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么
?
Input
一个数N(1<=N<=2,000,000,000)。
Output
不超过N的最大的反质数。
Sample Input
1000
Sample Output
840
约数个数定理。。。然后dfs一下。。。当我们把前11个质数乘起来就发现够了。。所以只需要对着十二个质数dfs就好了。。。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<algorithm> 7 #include<string> 8 #include<map> 9 #include<queue> 10 #include<vector> 11 #include<set> 12 #define inf 1000000000 13 #define maxn 10000+5 14 #define maxm 10000+5 15 #define eps 1e-10 16 #define ll long long 17 #define for0(i,n) for(int i=0;i<=(n);i++) 18 #define for1(i,n) for(int i=1;i<=(n);i++) 19 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 20 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 22 using namespace std; 23 int read(){ 24 int x=0,f=1;char ch=getchar(); 25 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 26 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 27 return x*f; 28 } 29 int p[15]={1,2,3,5,7,11,13,17,19,23,29,31}; 30 int n; 31 ll ans,num; 32 void dfs(int k,ll now,ll cnt,int last){ 33 if(k==12){ 34 if(now>ans&&cnt>num){ans=now;num=cnt;return;} 35 if(now<=ans&&cnt>=num){ans=now;num=cnt;return;} 36 return; 37 } 38 ll t=1; 39 for0(i,last){ 40 dfs(k+1,now*t,cnt*(last+1),i); 41 t*=p[k]; 42 if(now*t>n)return; 43 } 44 } 45 int main(){ 46 //freopen("input.txt","r",stdin); 47 //freopen("output.txt","w",stdout); 48 n=read(); 49 dfs(1,1,1,20); 50 printf("%lld",ans); 51 return 0; 52 }