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 Input1000Sample Output840
终于忍住没看题解,自己成功想出一个题
先筛质数,首先我们知道分解质因数后 i=p1^s1*p2^s2...pk^sk;那么g(i)=(s1+1)*(s2+1)*(s3+1)...(sk+1)
所以我们枚举质数的指数,直接枚举不太好
我们可以发现一个性质,反质数的各个指数一定是不上升的,因为上升的情况我们可以翻转上升的那一段,使得g不变i变小,这个时候搜索就无压力了
一开始没注意,其实前十个质数相乘已经很大了,我们只要前十个就行了
还有就是,要记录现在ans的g,如果有一样的g,要选小的那个
1 const 2 zhi:array[1..10]of integer=(2,3,5,7,11,13,17,19,23,29); 3 var 4 n,tot,ans,num:longint; 5 6 procedure try(x:int64;y,z,k:longint); 7 var 8 i:longint; 9 begin10 if (numn then exit;19 try(x,i,z+1,k*(i+1));20 end;21 end;22 23 begin24 read(n);25 try(1,n,1,1);26 write(ans);27 end.