1. 程式人生 > >1060 最復雜的數(反素數玄學dfs)

1060 最復雜的數(反素數玄學dfs)

時間 color csdn btn 復雜 ray void sof can

1060 最復雜的數 題目來源: 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

1060 最復雜的數(反素數玄學dfs)