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 ",ans1,ans); 78 } 79 return 0; 80 }