POJ 3421 X-factor Chains(數論)(篩法)()
阿新 • • 發佈:2019-02-16
X-factor Chains
-factor chains and the number of chains of such length.
Time Limit:1000MS | Memory Limit:65536K |
Total Submissions:6370 | Accepted:1973 |
Description
Given a positive integerX, anX-factor chain of lengthmis a sequence of integers,
1 =X0,X1,X2, …,Xm=X
satisfying
Xi<Xi+1andXi|Xi+1wherea|bmeansaperfectly divides intob.
Now we are interested in the maximum length ofX
Input
The input consists of several test cases. Each contains a positive integerX(X≤ 220).
Output
For each test case, output the maximum length and the number of suchX-factors chains.
Sample Input
2 3 4 10 100
Sample Output
1 1 1 1 2 1 2 2 4 6
題意:給你一個長度為m的整數序列,即1 =X0,X1,X2, …,Xm=X
這個序列滿足條件:Xi<Xi+1andXi|Xi+1wherea|bmeansaperfectly divides intob.每一個是前一個的倍數。(都是X的因子)
讓你求最大長度,和最多有多少中這樣長度的序列。
思路:首先篩法求素數;然後計算每個不同因子的指數和,即總因子數,就是最大長度了。
然後數量=冪和的階乘/各個冪階乘的和
已經AC,心中痛苦啊,因為 const int N = 1100005;//此處的資料要重視,本人wa了n次啊,大於1100005,小於10^7。
#include<iostream>//poj 3421 #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int N = 1100005;//此處的資料要重視,本人wa了n次啊 const int M = 10005; int num,n,index; int prime[M],flag[N],sum[M]; //存每個素因子的指數,即個數 void Init()//篩法求素數 { for(int i=2;i<=N;i++) { if(flag[i]) continue; prime[num++]=i; for(int j=2;i*j<=N;j++) flag[i*j]=1; } } int main() { Init(); while(scanf("%d",&n)!=EOF) { index=0;//又一次放錯了位置,哭死了 memset(sum,0,sizeof(sum));//初始化 for(int i=0;i<num;i++) { if(n%prime[i]==0)//找到所有因子 { while(n%prime[i]==0) { sum[index]++;//計算每個因子的指數和 n/=prime[i]; } index++;//別放在大括號外面了 } if(n==1) break; } //求所有因子的指數和 ll s=0,ans=1; for(int i=0;i<index;i++) s+=sum[i]; //求 for(ll i=2;i<=s;i++)//次數使用int也可以 ans*=i; for(int i=0;i<index;i++) { for(int j=2;j<=sum[i];j++) { ans/=j; } } printf("%lld %lld\n",s,ans); } return 0; }