整数的素数分解 POJ 1365

题意:

给一个整数x的素数分解形式,求出x-1的素数分解形式。

先把x算出来,再把x-1素数分解就可以了,注意一下pow的精度损失

代码:

#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include<climits>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;

#define PB push_back
#define MP make_pair

#define REP(i,x,n) for(int i=x;i<(n);++i)
#define FOR(i,l,h) for(int i=(l);i<=(h);++i)
#define FORD(i,h,l) for(int i=(h);i>=(l);--i)
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define RI(X) scanf("%d", &(X))
#define RII(X, Y) scanf("%d%d", &(X), &(Y))
#define RIII(X, Y, Z) scanf("%d%d%d", &(X), &(Y), &(Z))
#define DRI(X) int (X); scanf("%d", &X)
#define DRII(X, Y) int X, Y; scanf("%d%d", &X, &Y)
#define DRIII(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)
#define OI(X) printf("%d",X);
#define RS(X) scanf("%s", (X))
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
#define Swap(a, b) (a ^= b, b ^= a, a ^= b)
#define Dpoint  strcut node{int x,y}
#define cmpd int cmp(const int &a,const int &b){return a>b;}

 /*#ifdef HOME
    freopen("in.txt","r",stdin);
    #endif*/
const int MOD = 1e9+7;
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef pair<int,int> PII;
//#define HOME

int Scan()
{
	int res = 0, ch, flag = 0;

	if((ch = getchar()) == '-')				//判断正负
		flag = 1;

	else if(ch >= '0' && ch <= '9')			//得到完整的数
		res = ch - '0';
	while((ch = getchar()) >= '0' && ch <= '9' )
		res = res * 10 + ch - '0';

	return flag ? -res : res;
}
/*----------------PLEASE-----DO-----NOT-----HACK-----ME--------------------*/

int in[40000];
char s[100000];
int prime[10000];
int vis[40005];
int ans[40005];
void getprime()
{
    int cnt=0;
    for(int i=2;i<=40000;i++)
    {
        if(!vis[i])
        {
            prime[cnt++]=i;
            for(int j=0;j<cnt&&prime[j]<=40000/i;j++)
            {
                prime[prime[j]*i]=1;
                if(i%prime[j]==0)
                    break;
            }
        }
    }
}
int main()
{getprime();
while(gets(s))
{
    if(s[0]=='0')
        break;
    int len=strlen(s);
    int t=0;
    int cnt=0;
    REP(i,0,len)
    {if(s[i]==' ')
    {
        in[cnt++]=t;
        t=0;
        continue;
    }

      t=t*10+s[i]-'0';
    }
    in[cnt++]=t;
    int x=1;
    for(int i=0;i<cnt;i+=2)
    {
        x=x*(int)(pow((double)in[i],(double)in[i+1])+0.05);
    }
    x-=1;
    int p=(int)sqrt((double)x);
    int q=0;
    for(int i=2;i<=p;i++)
    {
        int tmp=0;
        if(x%i==0)
        {while(x%i==0)
        {
            x=x/i;
            tmp++;

        }
        ans[q++]=tmp;
        ans[q++]=i;

        }
    }
    if(x!=1)
    {
        ans[q++]=1;
        ans[q++]=x;
    }
    for(int i=q-1;i>0;i--)
        printf("%d ",ans[i]);
    printf("%d\n",ans[0]);

}

        return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 16:14:48

整数的素数分解 POJ 1365的相关文章

[水+整数分解] poj 1365 Prime Land

题意: 给2*n个数,输入的这些数构成 sum=(a[1]^b[1])*(a[2]^b[2])... 其实就是整数分解完的数. 然后让你输出分解sum-1的结果. 从大到小. 思路: 就是输入麻烦点. 注意题目说了1的时候要输出空行. 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue"

组合数学+整数分解 POJ 2992 Divisors

题意:给n,k,求C(n,k)的约数的个数. 由于C(n,k)=n!/(k!*(n-k)!),所以只要分别把分子分母的素因子的次数求出来,再用分子的每个素因子的次数减去分母的每个素因子的次数就可以得到C(n,k)的素数分解式,约数个数就等于(p1+1)(p2+1)*...*(pn+1).这道题n,k的范围都是四百多,按理说O(N^2)的算法可以过的,但是测试数据太多了,暴力的方法会TLE.看别人的报告知道了求N!的某个素因子次数的递归算法,然后枚举每个素数,求出它在阶乘中的次数,就可以AC了.

POJ 1365 Prime Land

Prime Land Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2972 Accepted: 1362 Description Everybody in the Prime Land is using a prime base number system. In this system, each positive integer x is represented as follows: Let {pi}i=0,1,2,

HDU 3988 Harry Potter and the Hide Story(数论-整数和素数)

Harry Potter and the Hide Story Problem Description iSea is tired of writing the story of Harry Potter, so, lucky you, solving the following problem is enough. Input The first line contains a single integer T, indicating the number of test cases. Eac

求最大公约数的两种解法(欧几里得算法和素数分解)

最大公约数的两种解法(欧几里得算法和素数分解) 方法一: 欧几里得算法,又称辗转相除法 定理(欧几里得算法):设a和b是正整数,则存在最大求最大公因子d=(a,b)的一种算法,且存在求一组整数s,t使得d = sa+tb 举个例子:求168和60的最大公约数? 168 = 2 * 60 + 48 60  = 1 * 48 +12 48  = 4 * 12 由此得最大公约数为12 关于最大公倍数 C语言程序代码:很简单就不加注释了 #include<stdio.h> #define SWAP(a

算法15---数论6---素数,回文素数 分解质因素

算法15---数论6---素数,回文素数  分解质因素 1 /* 2 题目:素数,回文素数 3 author taoliu——alex 2016.10 number4 4 5 主要实现: 6 判断素数,判断回文素数 7 */ 8 9 10 11 #include <stdio.h> 12 #include <math.h> 13 14 15 16 //素数 17 18 19 int isprime(int a) 20 { 21 for (int i = 2; i < a; i

HDU 1695 GCD (数论-整数和素数,组合数学-容斥原理)

GCD Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're only required to output t

light_oj 1220 素数分解

light_oj 1220  素数分解 J - Mysterious Bacteria Time Limit:500MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1220 Description Dr. Mob has just discovered a Deathly Bacteria. He named it RC-01. RC-01 has a very

校队训练赛,同时也是HDU4497(数论:素数分解+组合数学)

一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=4497 二.思路 将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y',x') = 1,同时lcm(x',y',x') = G/L.特判,当G%L != 0 时,无解.然后素数分解G/L,假设G/L = p1^t1 * p2^t2 *````* pn^tn.满足上面条件的x,y,z一定为这样的形式.x' = p1^i1 * p2^i2 *```* pn^in.y' =