Antiprime数(normal)
Time Limit:10000MS Memory Limit:65536K
Total Submit:24 Accepted:5
Case Time Limit:1000MS
Description
如果一个自然数n(n>=1),满足所有小于n的自然数(>=1)的约数个数都小于n的约数个数,则n是一个Antiprime数。譬如:1, 2, 4, 6, 12, 24。
任务:编一个程序:
1、从ANT.IN中读入自然数n。
2、计算不大于n的最大Antiprime数。
3、将结果输出到ANT.OUT中。
Input
输入只有一个整数,n(1 <= n <= 2 000 000 000)。
Output
输出只包含一个整数,即不大于n的最大Antiprime数。
Sample Input
1000
Sample Output
840
首先我们要知道:对于任意的一个数都能用质数表示,n=2^x * 3^y * 5^z.....,而要求n的约数个数的话,就通过乘法原理s=(x+1)*(y+1)*(z+1)....;
然而要求不大于n的最大反质数就可以转化成求 1-n中 最大约数个数的最小数。最后搜索每个质数的系数的个数就可以得到结果。
下面是AC代码:
#include<iostream> #include<cmath> using namespace std; const int MAX=0x7fffffff; int prime[]= { 0,2,3,5,7,11,13,17,19,23,29,31}; int n,max_val; __int64 ans; void dfs(__int64 cur,int num,int op){ if(op>max_val) max_val=op,ans=MAX; if(op==max_val&&cur<ans) ans=cur; if(num>=10) return ; for(int i=1;cur<=n;cur*=prime[num],i++) dfs(cur,num+1,op*i); } int main(){ //cin>>n; while(scanf("%d",&n)!=EOF){ max_val=0; ans=MAX; dfs(1,1,1); printf("%d\n",ans); } return 0; }