zoukankan      html  css  js  c++  java
  • 唯一分解定理 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=='
    ')
            {
                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
    ",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=='
    ')
                        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
    ",di[0],zhi[0]);
            }
    
        }
        return 0;
    }
  • 相关阅读:
    数独游戏 C++ 回溯法
    DirectX 90 3D 网格一
    DirectX 90 3D SetRenderState 设置渲染状态
    DirectX90 3D 字体
    DirectX 90 3D 外接体
    VS2005下配置OGRE
    DirectX 90 3D 网格二
    Java反射机制
    UBUNTU下安装 APACHE+PHP+MYSQL文本服务器!
    关于那个SMTP类及一个例子
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6170841.html
Copyright © 2011-2022 走看看