[水+整数分解] 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"
#include"algorithm"
#include"iostream"
#include"map"
#include"stack"
#include"vector"
#define ll __int64
#define inf -999999999999999999LL
using namespace std;
char v[123456];
#define MAXN 100007
bool mark[MAXN];
int ss[MAXN/3],sscnt;
int ans1[MAXN/3],ans2[MAXN/3];
void ssb()
{
    sscnt=0;
    memset(mark,false,sizeof(mark));
    mark[0]=mark[1]=true;
    for(int i=2; i<=MAXN; i++)
    {
        if(!mark[i])
        {
            for(int j=i+i; j<=MAXN; j+=i) mark[j]=true;
            ss[sscnt++]=i;
        }
    }
    return ;
}
int main()
{
    ssb();
    while(gets(v),strcmp(v,"0"))
    {
        int f=0,i=0;
        ll a=0,b=0;
        ll sum=1;
        while(v[i])
        {
            if(v[i]>='0' && v[i]<='9')
            {
                while(v[i]>='0' && v[i]<='9')
                {
                    if(!f) a=a*10+v[i]-'0';
                    else b=b*10+v[i]-'0';
                    i++;
                }
                if(f==1)
                {
                    sum*=(ll)(pow(a*1.0,b*1.0)+0.0000001);
                    a=0;
                    b=0;
                }
                f^=1;
            }
            else i++;
        }
        sum--;
        int kx=0;
        for(int i=0; i<sscnt; i++)
        {
            if((ll)ss[i]>sum) break;
            if(sum%ss[i]==0)
            {
                int tep=0;
                while(sum%ss[i]==0)
                {
                    tep++;
                    sum/=ss[i];
                }
                ans1[kx]=i;
                ans2[kx++]=tep;
            }
        }
        if(kx==0)
        {
            puts("");
            continue;
        }
        for(int i=kx-1;i>=0;i--)
        {
            printf(i==0?"%d %d\n":"%d %d ",ss[ans1[i]],ans2[i]);
        }
    }
    return 0;
}
时间: 2024-10-20 12:04:44

[水+整数分解] poj 1365 Prime Land的相关文章

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,

POJ 1365 Prime Land(整数拆分)

题意:感觉题意不太好懂,题目并不难,就是给一些p和e,p是素数,e是指数,然后把这个数求出来,设为x,然后让我们逆过程输出x-1的素数拆分形式,形式与输入保持一致. 思路:素数打表以后正常拆分即可. 注意:输入过程需要优化,我以前经常使用字符串模拟的方式,后来发现那种方法比较笨,还是下面的方法简洁:代码如下: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> using

poj 1365 Prime Land 质因数分解

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int primeNUM[] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,

整数的素数分解 POJ 1365

题意: 给一个整数x的素数分解形式,求出x-1的素数分解形式. 先把x算出来,再把x-1素数分解就可以了,注意一下pow的精度损失 代码: #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include<climits> #include <algorithm> #include <

组合数学+整数分解 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 2992 Divisors 整数分解

设m=C(n,k)=n!/((n-k)!*k!) 问题:求m的因数的个数 将m分解质因数得到 p1有a1个 p2有a2个 .... 由于每个质因数可以取0~ai个(全部取0就是1,全部取ai就是m)最后的答案就是(a1+1)*(a2+1)*....* 注意不能直接将m分解,因为太大,所以要先分解n,n-k,k,根据他们再来加减. #include <iostream> #include <cstdio> #include <cmath> #include<cstr

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

[暑假集训--数论]poj1365 Prime Land

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,... denote the increasing sequence of all prime numbers. We know that x > 1 can be represented in only

POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the num