1. 程式人生 > >POJ 3421(X-factor Chains)素數

POJ 3421(X-factor Chains)素數

題意:輸入1個X,求解序列1,a0,a1,a2......am(am=X),其中滿足任意i(ai%ai-1==0),求解最大的m和滿足的序列個數

求解X的質因子個數即為m,再算出所有質因子的全排列個數。

n=4時,質因子{2,2},m為2,全排列只有一種

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<vector>
#include<cstring>
#define LL long long
using namespace std;
#define N 1100000
int a[1100000];
void is_sushu()
{
    memset(a,0,sizeof(a));//對陣列a進行初始化為0,不是素數的標記為1,剩下為0的就是素數了
    a[1]=1;//1既不是素數也不是合數,先標記為0
    for(int i=2; i<=sqrt(N); i++)
    {
        if(a[i]==0)//如果i是素數
        {
            for(int j=2; j*i<=N; j++) //迴圈標記的範圍是i*j<N
            {
                a[i*j]=1;//如果i是素數,那麼i*j肯定不是素數
            }
        }
    }//最終所有非素數都標記為1,素數都標記為0
}
//vector<int>v;
int b[N];
int main()
{
    is_sushu();
    int n;
    while(cin>>n)
    {
       // v.clear();
        int k=0;
        for(int i=2;i<=n;i++)
        {
            if(a[i]==0)
            while(n%i==0)
            {
                //int num=i;
                //v.push_back(num);
                b[k++]=i;
                n/=i;
            }
        }
        cout<<k<<' ';
        sort(b,b+k);
        int cnt=0;
        do
        {
            cnt++;
        }while(next_permutation(b,b+k));
        cout<<cnt<<endl;
    }
    return 0;
}