HDU 4497 GCD and LCM

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497
题目大意:给定两个数L,GL,G,问满足gcd(x,y,z)=G,lcm(x,y,z)=Lgcd(x,y,z)=G, lcm(x,y,z)=L(x,y,z)(x,y,z)组合有多少种?

思路:

首先我们可以判断:

如果LL不能被GG整除的话,这样的组合一定不存在。

当这样的组合存在的时候,我们可以令tmp=LGtmp=\frac{L}{G},那么题目所求方案数与求gcd(x,y,z)=1gcd(x,y,z)=1lcm(x,y,z)=tmplcm(x,y,z)=tmp的方案数是等价的。

那么我们对tmptmp进行素数分解:tmp=p1t1p2t2pntntmp=p_1^{t_1} * p_2^{t_2} * ……* p_n^{t_n}

因为tmptmp是这三个数的倍数,因而同样可得x,y,zx,y,z的组成形式为:

x=p1i1p2i2pninx=p_1^{i_1} * p_2^{i_2} * ……* p_n^{i_n}

y=p1j1p2j2pnjny=p_1^{j_1} * p_2^{j_2} * ……* p_n^{j_n}

z=p1k1p2k2pnknz=p_1^{k_1} * p_2^{k_2} * ……* p_n^{k_n}

对于某一个素因子pp

因为要满足gcd(x,y,z)=1gcd(x,y,z)=1,即三个数没有共同的素因子,所以min(i,j,k)=0min(i,j,k)=0

又因为要满足lcm(x,y,z)=tmplcm(x,y,z)=tmp,即ptp^t必然要至少存在一个,所以max(i,j,k)=tmax(i,j,k)=t

换言之:至少要有一个ptp^t,以满足lcm(x,y,z)=tmplcm(x,y,z)=tmp的要求;至多有两个包含ptp^t,以满足gcd(x,y,z)=1gcd(x,y,z)=1的要求。

因而基本的组合方式为(0,pt,pk)(0,p^t,p^k)kk的取值范围为[0,t][0,t]

而因为(1,2,3)(1,2,3)(2,1,3)(2,1,3)是不同的方法,所有满足要求的方法中,除了(0,0,t)(0,0,t)(0,t,t)(0,t,t)各有3种排列之外,其余都有6种排列。

对于某一个素因子pip_i总的方法数为6(ti1)+23=6ti6*(t_i-1)+2*3=6*t_i

最终答案ans=(6t1)(6t2)........(6tn)ans=(6*t_1)*(6*t_2)*........*(6*t_n)
AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int mod=1e9+7;
int prime[maxn],tot=0,mu[maxn];
int g,l;
int solve(int x)//分解tmp
{
    int sum=1;
    for(int i=2;i*i<=x;i++){
        if(x%i==0){
            int cnt=0;
            while(x%i==0){
                cnt++;
                x/=i;
            }
            sum*=6*cnt;
        }
    }
    if(x>1){
        sum*=6*1;
    }
    return sum;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        cin>>g>>l;
        int ans;
        if(l%g!=0){
            ans=0;
        }  
        else{
            l/=g;
            ans=solve(l);
        }
        cout<<ans<<endl;
    }
    return 0;
}

参考:https://www.bbsmax.com/A/gGdXnNbYJ4/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章