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/

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