西南交大公开赛 Not So Flat After All(合数分解)

给出2个数,找出素因子分解的形式,给出2数素因子集合并集的基数,以及对应指数的绝对值之和

#include <cstdio>
#include <cstring>
#define abs(a) (a)>(0)?(a):(-(a))
const int maxn=1000000;
const int PRIMERANGE = 1000000;
int prime[PRIMERANGE + 1];

int getPrime()
{
    memset (prime, 0, sizeof (int) * (PRIMERANGE + 1));
    for (int i = 2; i <= PRIMERANGE; i++)
    {
        if (!prime[i]) prime[++prime[0]] = i;
        for (int j = 1; j <= prime[0] && prime[j] <= PRIMERANGE / i; j++)
        {
            prime[prime[j]*i] = 1;
            if (i % prime[j] == 0) break;
        }
    }
    return prime[0];
}

int factor[100][3], facCnt;
int factor2[100][3];//only for this 
int getFactors(int x)
{
    facCnt = 0;
    memset(factor,0,sizeof(factor));
    int tmp = x;
    for(int i = 1; prime[i] <= tmp / prime[i]; i++)
    {
        factor[facCnt][1] = 1, factor[facCnt][2] = 0;
        if(tmp % prime[i] == 0)
            factor[facCnt][0] = prime[i];
        while(tmp % prime[i] == 0)
            factor[facCnt][2]++, factor[facCnt][1] *= prime[i], tmp /= prime[i];
        if(factor[facCnt][1] > 1) facCnt++;
    }
    if(tmp != 1)
        factor[facCnt][0] = tmp, factor[facCnt][1] = tmp, factor[facCnt++][2] = 1;
    return facCnt;
}
int ans,cntans;
int I=0;
int main ()
{
    getPrime();
    int n,m;
    while (scanf("%d%d",&n,&m),(n||m))
    {
        int cntn=getFactors(n);
        memcpy(factor2,factor,sizeof(factor));
        int cntm=getFactors(m);
        int pn=0,pm=0;
        ans=cntans=0;
        while (pn<cntn && pm<cntm)
        {
            if(factor2[pn][0]<factor[pm][0]){ans++;cntans+=factor2[pn][2];  pn++;}
            else
            if(factor[pm][0]<factor2[pn][0]){ans++;cntans+=factor[pm][2]; pm++;}
            else
            {ans++ ; cntans+=abs(factor[pm][2]-factor2[pn][2]);pn++; pm++;}
        }
        ans+=(cntn-pn+cntm-pm);
        while (pn<cntn)
            cntans+=factor2[pn++][2];
        while (pm<cntm)
            cntans+=factor[pm++][2];
        printf("%d. %d:%d\n",++I,ans,cntans);
    }
    return 0;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值