1060 最复杂的数(反素数玄学dfs)

题目来源: Ural 1748
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
把一个数的约数个数定义为该数的复杂程度,给出一个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
 
 
 
//就是求,小于等于 n 的反素数,外链走一波-反素数深度分析,很好理解
解法就是dfs走一波,可以剪枝,较小的素数的指数>=较大的素数的指数
但是这复杂度感觉上还是挺高的,算不清楚。。。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define INF 0x3f3f3f3f
 4 #define eps 1e-9
 5 #define LL long long
 6 #define MX 10005
 7 
 8 const int prim[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
 9 
10 LL n;
11 LL big, num;
12 
13 void dfs(int step, LL sz, LL yue, int mmm)
14 {
15     if (step>=16) return;
16     if (yue>big)
17     {
18         big = yue;
19         num = sz;
20     }
21     if (yue==big&&sz<num)
22         num = sz;
23     for (int i=1;i<=63;i++)
24     {
25         if (n/sz>=prim[step]&&i<=mmm)
26             dfs(step+1,sz*=prim[step],yue*(i+1),i);
27         else break;
28     }
29 }
30 
31 int main()
32 {
33     int T;
34     scanf("%d",&T);
35     while(T--)
36     {
37         scanf("%lld",&n);
38         big=0;
39         dfs(0,1,1,64);
40         printf("%lld %lld\n",num,big);
41     }
42     return 0;
43 }
View Code

 

 
posted @ 2017-10-03 12:06  happy_codes  阅读(342)  评论(0编辑  收藏  举报