H - Pairs Forming LCM 求对于x,lcm(a,b)=x,这样的对数的个数。

这篇博客探讨了如何求解对于给定的x,满足lcm(a, b) = x的数对(a, b)的个数。通过分析a和b的质因数分解,可以得出每一对质因子对应的情况数,并通过乘法原理计算总数。由于a < b,需要排除a = b的情况并除以2来修正重复计数。" 132399421,19687571,R语言使用Shiny动态切换线条颜色,"['R语言', '开发语言', 'Shiny']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

H - Pairs Forming LCM
在这里插入图片描述
GCD&&LCM

a=p1 ^ a1 * p2 ^ a2 *…*pn ^ an
b=p1 ^ b1 * p2 ^ b2 *…*pn ^ bn
gcd(a,b)=p1 ^ min(a1,b1) * p2 ^ min(a2,b2) *…*pn ^ min(an,bn)
lcm(a,b)=p1 ^ max(a1,b1) * p2 ^ max(a2,b2) *…*pn ^ max(an,bn)


lcm(a,b)=c.
c=p1 ^ c1 * p2 ^ c2 *…*pn ^ cn
a=p1 ^ a1 * p2 ^ a2 *…*pn ^ an
b=p1 ^ b1 * p2 ^ b2 *…*pn ^ bn

对于p1这个质因子来讲:a1=c1,b1=c1,应有一个成立.
当a1=c1时,b1可取(0,c1)任意值。有(c1+1)种情况。
同理当b1=c1时,a1可取(0,c1)任意值。有(c1+1)种情况。
两种情况都包含a1=c1&&b1=c1,b1=c1&&a1=c1这总情况。
对于每个质因子有2* c1+1种情况。
故总共有 (2*c1+1) * (2 *c2+1) * … *(2 *cn+1).对数。但是a<b.
这里面会有a=b的这一对情况不合理。除了这一对的没对对称存在应/2.因为(a<b)

#include<cstdio>
#include<iostream>
#include<cmath>
#define en '\n'
using namespace std;
typedef long long ll;
const int N=1e6;
int prime[N],tot;
bool is[N*10+5];
void getprime()
{
    tot=0;
    for(int i=2;i<=N*10;++i)
    {
        if(!is[i]) prime[++tot]=i;
        for(int j=1;j<=tot;++j)
        {
            if((ll)i*prime[j]>N*10) break;
            is[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
}
ll solve(ll n)//采用素数分解质因子 时间复杂度降低
{
    ll ans=1;
    for(ll i=1;prime[i]*prime[i]<=n&&i<=tot;++i)
    {
        int num=0;
        while(n%prime[i]==0) ++num,n/=prime[i];
        if(num) ans*=2*(num+1)-1;
    }
    if(n>1) ans*=2*(1+1)-1;
    return ans;
}
int main()
{
    getprime();
    int T,cas=0;scanf("%d",&T);
    while(T--)
    {
        ll n;scanf("%lld",&n);
        ll ans=solve(n);
        printf("Case %d: %lld\n",++cas,(ans-1)/2+1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值