1060 最复杂的数

 1060 最复杂的数

把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。
 
例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6。如果有多个数复杂度相等,输出最小的。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 100)
第2 - T + 1行:T个数,表示需要计算的n。(1 <= n <= 10^18)
Output
共T行,每行2个数用空格分开,第1个数是答案,第2个数是约数的数量。
Input示例
5
1
10
100
1000
10000
Output示例
1 1
6 4
60 12
840 32
7560 64.


好吧 这是求反素数
关于反素数 不懂可以百度

 1 #include <cstdio>
 2 #include <cctype>
 3 
 4 typedef unsigned long long ULL;
 5 
 6 const int MAXN=70;
 7 const ULL INF=~0ULL;
 8 
 9 int T,num;
10 
11 ULL n,ans; 
12 
13 int map[MAXN][MAXN];
14 int prime[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
15 
16 inline void read(ULL&x) {
17     int f=1;register char c=getchar();
18     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
19     for(;isdigit(c);x=x*10+c-48,c=getchar());
20     x=x*f;
21 }
22 
23 void DFS(int depth,int limit,ULL The,int p) {
24     if(The>n) return;
25     if(p>num) {num=p;ans=The;}
26     if(p==num&&ans>The) ans=The;
27     for(int i=1;i<=limit;++i) {
28         double cur=(double) The;
29         if(n<cur*prime[depth]) break;
30         DFS(depth+1,i,The*=prime[depth],p*(i+1));
31     }
32 }
33 
34 int hh() {
35     scanf("%d",&T);
36     while(T--) {
37         read(n);
38         ans=INF;
39         num=0;
40         DFS(0,60,1,1);
41         printf("%lld ",ans);
42         printf("%d\n",num);
43     }
44     return 0;
45 }
46 
47 int sb=hh();
48 int main(int argc,char**argv) {;}
代码

 

posted @ 2017-09-17 20:35  拿叉插猹哈  阅读(283)  评论(0编辑  收藏  举报