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

来源:互联网 发布:淘宝店铺怎么改名字啊 编辑:程序博客网 时间:2024/05/16 14:42

题意:

给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 -999999999999999999LLusing namespace std;char v[123456];#define MAXN 100007bool 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;}


0 0