1. 程式人生 > >POJ-3421-X-factor Chains

POJ-3421-X-factor Chains

自己推的,其實就是分解因式,然後注意下剪枝。後臺資料很大,最開始我開的陣列記錄,每次都初始化,但這樣耗費的時間直接導致超時,後面去掉了就OK了~

程式碼:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=(1<<20)+2;
bool ispri[maxn];
int n,pri[maxn],cnt,ans;
long long fact[21];
void Init()
{
    cnt=0;
    ispri[1]=1;
    for(int i=2;i<maxn;i++)
	if(!ispri[i])
	{
	    pri[cnt++]=i;
	    for(int j=2;i*j<maxn;j++)
		ispri[i*j]=1;
	}
    fact[0]=1;
    for(int i=1;i<=20;i++)
	fact[i]=fact[i-1]*i;
}
int main()
{
    Init();
    while(scanf("%d",&n)!=EOF)
    {
	ans=0;
	int m=n,index=0;
	long long divs=1;
	while(m>1)
	{
	    if(m%pri[index]==0)
	    {
		int dcnt=0;
		while(m%pri[index]==0)
		{
		    m/=pri[index];
		    dcnt++;
		}
		divs=divs*fact[dcnt];
		ans+=dcnt;
	    }
	    index++;
	    if(!ispri[m])
	    {
		ans++;
		break;
	    }
	}
	long long s=fact[ans];
	s/=divs;
	printf("%d %I64d\n",ans,s);
    }
    return 0;
}