X-factor Chains [POJ3421] [素数]

Description
    给定一个正整数X, 一个长度为m的X-因子链是由m+1个整数组成的。其中
    1 = X0, X1, X2, …, Xm = X 满足Xi < Xi+1 且 Xi 整除 Xi+1 。
    现在要求X-因子链的最大长度和最大长度有多少条?
Input
    多组数据,每一组数据一个正整数X (X ≤ 220).
Output
    对于每组数据,输出X-因子链的最大长度和最大长度有多少条
Sample Input
    2
    3
    4
    10
    100
Sample Output
    1 1
    1 1
    2 1
    2 2
    4 6
Analysis

1.子链的长度就是分解质因数后每个质因数个数的和。为什么?如果出现一个合数,必定可以再分解使子链加长。

2.剩下的工作就是dfs,注意每一步只能选泽一种质数去分解。分解到1记一个贡献

Code

 1 #include<set>
 2 #include<map>
 3 #include<queue>
 4 #include<stack>
 5 #include<cmath>
 6 #include<cstdio>
 7 #include<cstring>
 8 #include<iostream>
 9 #include<algorithm>
10 #define RG register int
11 #define rep(i,a,b)    for(RG i=a;i<=b;++i)
12 #define per(i,a,b)    for(RG i=a;i>=b;--i)
13 #define ll long long
14 #define inf (1<<29)
15 #define maxn 1048580
16 #define lim 1048578
17 using namespace std;
18 int n,cnt,pt,ans,ans1;
19 int isp[maxn],p[maxn];
20 int num[maxn][2];
21 inline int read()
22 {
23     int x=0,f=1;char c=getchar();
24     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
25     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
26     return x*f;
27 }
28 
29 void pre()
30 {
31     rep(i,2,lim)
32     {
33         if(!isp[i])    p[++cnt]=i;
34         for(RG j=1;j<=cnt&&p[j]*i<=lim;j++)
35         {
36             isp[i*p[j]]=1;
37             if(!(i%p[j]))    break;
38         }    
39     }
40 }
41 
42 void work()
43 {
44     int res=n;
45     rep(i,1,cnt)
46     {
47         if(!(res%p[i])){
48             num[++pt][0]=p[i],num[pt][1]=0;
49             while(!(res%p[i]))    ++num[pt][1],res/=p[i],++ans1;
50         }
51         if(res==1)    break;
52     }
53 }
54 
55 void dfs(int res)
56 {
57     if(res==1){ans++;return;}
58     for(int i=1;i<=pt;i++)
59     {
60         if(num[i][1])    
61         {
62             num[i][1]--;
63             dfs(res/num[i][0]);
64             num[i][1]++;
65         }
66     }
67 }
68 
69 int main()
70 {
71     pre();
72     while(~scanf("%d",&n))
73     {
74         pt=ans=ans1=0;
75         work();
76         dfs(n);
77         printf("%d %d\n",ans1,ans);
78     }
79     return 0;
80 }
View Code

猜你喜欢

转载自www.cnblogs.com/ibilllee/p/9245566.html