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) {;}
代码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值