1060 最复杂的数(反素数玄学dfs)
把一个数的约数个数定义为该数的复杂程度,给出一个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 }