唯一分解定理 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;
}
时间: 2024-10-10 08:27:35

唯一分解定理 poj 1365的相关文章

POJ 1730 Perfect Pth Powers(唯一分解定理)

http://poj.org/problem?id=1730 题意:给出一个n,a=b^p,求出最大p值. 思路: 首先利用唯一分解定理,把n写成若干个素数相乘的形势.接下来对于每个指数求最大公约数,该公约数就是所能到达的最大p值. 有一点要注意的是如果n为负数的话,如果当前p值为偶数,就一直除2直到p为奇数. 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<cstr

POJ 1845 - Sumdiv ( 数论 + 唯一分解定理 + 快速幂取模 )

POJ 1845 - Sumdiv ( 数论 + 唯一分解定理 + 快速幂取模 ) 这是一道数论的好题,需要较好的数学基础 题意: 给定A,B,求A^B的所有因数的和,再MOD 9901 分析: 这里用到了数论当中相当一部分知识 a. 唯一分解定理 任何一个整数都可以分解为若干个素数的幂的乘积的形式 A = ( p1 ^ q1 + p2 ^ q2 + ..... + pn ^ qn ) p为素数 A^B = ( p1 ^ (q1*B) + p2 ^ (q2*B) + ..... + pn ^ (

POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)

Sumdiv Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1845 Appoint description:  System Crawler  (2015-05-27) Description Consider two natural numbers A and B. Let S be the sum of all natural d

HDU 1452 Happy 2004(唯一分解定理)

题目链接:传送门 题意: 求2004^x的所有约数的和. 分析: 由唯一分解定理可知 x=p1^a1*p2^a2*...*pn^an 那么其约数和 sum = (p1^0+p1^1^-+p1^a1)*-* (pn^0+pn^1^-+pn ) 代码如下: #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const

NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数和最小公倍数.现 在 Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公 倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数 a0,a1,b0,b1,设某未知正整 数 x 满足: 1. x 和 a0 的最大公约

欧几里德算法和唯一分解定理

刘汝佳<入门经典>上提供了一道经典的题目: 除法表达式,在NYOJ上可以找到原题,题号1013 描述 给出一个这样的除法表达式:X1/X2/X3/···/Xk,其中Xi是正整数.除法表达式应当按照从左到右的顺序求和,例如表达式1/2/1/2值为1/4.但是可以在表达式中嵌入括号以改变计算顺序,例如表达式(1/2)/(1/2)的值为1. 输入 首先输入一个N,表示有N组测试数据, 每组数据输入占一行,为一个除法 表 达式,输入保证合法. 使表达式的值为整数.k<=10000,Xi<=

Coderforce-574C Bear and Poker(素数唯一分解定理)

题目大意:给出n个数,问能不能通过让所有的数都乘以2的任意幂或乘以3的任意幂,使这n个数全都相等. 题目分析:最终n个数都是相等的,假设那个数为x,根据素数唯一分解定理,x能分解成m*2p3q.所以,只需将所有的a[i]一直除以2并且一直除以3,最终只需判断这n个数是否全部相等即可. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<string> # include

唯一分解定理(算术基本定理)及应用

算术基本定理:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 N = p1^a1 * p2^a2 * p3^a3 * ... * pn^an (其中p1.p2.... pn为N的因子,a1.a2.... .an分别为因子的指数) 这样的分解称为 N 的标准分解式 应用: (1)一个大于1的正整数N,如果它的标准分解式为: N = p1^a1 * p2^a2 * p3^a3 * ... * pn^an (2)N的因子个数     M(N)= (1 + a1)*(1

uva 10375 唯一分解定理 筛法求素数【数论】

唯一分解理论的基本内容: 任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的.换句话说,一个数能被唯一地分解成质因数的乘积.因此这个定理又叫做唯一分解定理. 举个栗子:50=(2^1)*(5^2) 题目一般的思路就是要把素数表打出来,eg上面的例子 e={1,0,2,0,0......} 下面是两个题目,仅说说大致的思想: 题目一: E=(X1*X3*X4* ...*Xk)/X2   判断E是不是整数 如果把(X1*X3*X4* ...*Xk)分解成素数相乘,将X2也分解成素