POJ 3421

X-factor Chains
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5111   Accepted: 1622

Description

Given a positive integer X, an X-factor chain of length m is a sequence of integers,

1 = X0, X1, X2, …, Xm = X

satisfying

Xi < Xi+1 and Xi | Xi+1 where a | b means a perfectly divides into b.

Now we are interested in the maximum length of X-factor chains and the number of chains of such length.

Input

The input consists of several test cases. Each contains a positive integer X (X ≤ 220).

Output

For each test case, output the maximum length and the number of such X-factors chains.

Sample Input

2
3
4
10
100

Sample Output

1 1
1 1
2 1
2 2
4 6

Source

 
找出x的所有质因子表达式,最大长度就是各质因子指数的和,然后按照排列组合计算即可。
 
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 
 6 using namespace std;
 7 
 8 #define maxn (1 << 20) + 5
 9 
10 typedef long long ll;
11 
12 int x,len = 0;
13 bool prime[maxn];
14 int ele[100000];
15 
16 ll cal(int x) {
17         ll ans = 1;
18         for(int i = 1; i <= x; i++) ans *= i;
19 
20         return ans;
21 }
22 
23 void init() {
24         for(int i = 2; i <= maxn - 5; i++) {
25                 prime[i] = i % 2 || i == 2;
26         }
27 
28         for(int i = 2; i * i <= maxn - 5; i++) {
29                 if(!prime[i]) continue;
30                 for(int j = i; j * i <= maxn - 5; j++) {
31                         prime[j * i] = 0;
32                 }
33         }
34 
35         len = 0;
36         for(int i = 2; i <= maxn - 5; i++) {
37                 if(prime[i])
38                 ele[len++] = i;
39         }
40 
41 
42 }
43 int main() {
44         //freopen("sw.in","r",stdin);
45 
46         init();
47 
48         while(~scanf("%d",&x)) {
49                 if(prime[x]) {
50                         printf("1 1
");
51                 } else {
52                         int ans1 = 0,len2 = 0;
53                         ll ans2 = 0;
54                         int num[30];
55                         for(int i = 0; i < len && ele[i] <= x && x != 1; i++) {
56                                 int sum = 0;
57                                 if(x % ele[i] == 0) {
58                                         while(x % ele[i] == 0) {
59                                                 ans1++;
60                                                 sum++;
61                                                 x /= ele[i];
62                                         }
63                                         num[len2++] = sum;
64                                 }
65 
66 
67                         }
68 
69                         ans2 = cal(ans1);
70                         for(int i = 0; i < len2; i++)  {
71                                 ans2 /= cal(num[i]);
72                         }
73                         printf("%d %I64d
",ans1,ans2);
74 
75                 }
76 
77         }
78 
79         return 0;
80 }
View Code
原文地址:https://www.cnblogs.com/hyxsolitude/p/3592553.html