[水+整数分解] 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值