hdu 4497 已知三个数的gcd和lcm,求满足这个条件的三个的组数


GCD and LCM 

题意:已知三个数的gcd和lcm,求满足这个条件的三个的组数,顺序可以不同


思路:gcd(x,y,z) == G, lcm(x,y,z) == L,则gcd( x', y',z') == 1,lcm(x',y',z') == L/G ,其中x' = x /G,y' = y /G ,z' = z / G;

这样的话对t = L/G 这个数进行素因子分解,t = p1^t1 * p2^t2 * p3^t3 ..... * pn ^tn;

满足上面条件的x,y,z一定为这样的形式。
x' = p1^i1 * p2^i2 *```* pn^in.
y' = p1^j1 * p2^j2 * ```*pn^jn.
z' = p1^k1 * p2^k2 * ```*pn^kn.
为了满足上面的条件,对于p1,一定有max(i1,j1,k1) = t1.min(i1,j1,k1) =0;因为gcd(p1^i1,p1^j1,p1^k1)== 1 == p^0, => min(i1,j1,k1) == 0;

同理:lcm(p1^i1,p1^j1,p1^k1) == p1^t1   => max(i1,j1,k1) == t1;那么的话三个数中至少有一个0,和一个t1,第三个数则是在[0, t1]这个区间里的一个数;

则当选定第一个数为0,第二个数为t1时,第三个数可以为【0,t1】,又由于有顺序的,只有(0,t1,t1) 和(0,t1,0)这两种情形根据顺序只能产生三种结果,其他的第三个数在在【1,n-1】这个区间由于三个数都不一样,一定能产生6种,所以最后产生了6*(t1-1)+3*2 = 6*t1种,根据乘法原理以及关于素数分解的唯一性,反过来,素数组合必然也是唯一的数,一共有6*t1 * 6*t2 *`````*6*tn种选法。


接下来就是代码了:


#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll  depart(ll n)
{
    ll ans = 1;
    for(int i = 2; i * i <= n; i ++)
    {
        if(n % i == 0)
        {
            int t = 0;
            while(n % i == 0)
            {
                t ++;
                n /= i;
            }
            ans *= t * 6;
        }
    }
    if(n > 1)
        ans *= 6;
    return ans;
}
int main()
{
    int Tcase;
    scanf("%d",&Tcase);
    for(int ii = 1; ii <= Tcase; ii ++)
    {
        ll n,m;
        scanf("%I64d%I64d",&n,&m);
        if(m % n)
        {
            cout << 0 << endl;
            continue;
        }
        ll t = m /n;
        cout << depart(t) << endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值