首页 > 代码库 > 唯一分解定理 poj 1365

唯一分解定理 poj 1365

一行代表一个数 x 给你底数和指数

求x-1的唯一分解定理的底数和指数 从大到小输出

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<math.h>

using namespace std;
#define MAXN 100010
double z[MAXN],x[MAXN];
bool pri[MAXN];
int  p[MAXN];
int  di[MAXN],zhi[MAXN];

int main()
{
    memset(pri,0,sizeof(pri));

    for(int i=2;i<=32768;i++)
    {
        if(!pri[i])
            for(int j=i*i;j<=32768;j=j+i)
                pri[j]=1;
    }
    int ans=0;
    for(int i=2;i<=32768;i++)
        if(!pri[i])
            p[ans++]=i;

    while(scanf("%lf",&z[1])!=EOF)
    {
        if(z[1]==0)
            break;
        char s;
        scanf("%lf%c",&x[1],&s);
        int cnt=2;
        int cnt1=0;
        memset(di,0,sizeof(di));
        memset(zhi,0,sizeof(zhi));

        if(s==\n)
        {
            double a=pow(z[1],x[1]);
            long long b=(long long) a;
            b--;

            for(int i=0;i<ans;i++)
            {
                if(b%p[i]==0)
                {
                    while(b%p[i]==0)
                    {
                        b=b/p[i];
                        zhi[cnt1]++;
                    }
                    di[cnt1++]=p[i];
                }
            }
            if(b>1)
            {
                di[cnt1]=b;
                zhi[cnt1++]=1;
            }
            for(int i=cnt1-1;i>0;i--)
                printf("%d %d ",di[i],zhi[i]);
            printf("%d %d\n",di[0],zhi[0]);
        }
        else
        {
            double a=pow(z[1],x[1]);
            while(scanf("%lf%lf%c",&z[cnt],&x[cnt],&s))
            {
                cnt++;
                if(s==\n)
                    break;
            }
            for(int i=2;i<cnt;i++)
            {
                a*=pow(z[i],x[i]);
            }
            long long b=(long long) a;
            b--;
            for(int i=0;i<ans;i++)
            {
                if(b%p[i]==0)
                {
                    while(b%p[i]==0)
                    {
                        b=b/p[i];
                        zhi[cnt1]++;
                    }
                    di[cnt1++]=p[i];
                }
            }
            if(b>1)
            {
                di[cnt1]=b;
                zhi[cnt1++]=1;
            }
            for(int i=cnt1-1;i>0;i--)
                printf("%d %d ",di[i],zhi[i]);
            printf("%d %d\n",di[0],zhi[0]);
        }

    }
    return 0;
}

 

唯一分解定理 poj 1365