題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4497
題目大意:給定兩個數,問滿足的組合有多少種?
思路:
首先我們可以判斷:
如果不能被整除的話,這樣的組合一定不存在。
當這樣的組合存在的時候,我們可以令,那麼題目所求方案數與求且的方案數是等價的。
那麼我們對進行素數分解:。
因爲是這三個數的倍數,因而同樣可得的組成形式爲:
對於某一個素因子:
因爲要滿足,即三個數沒有共同的素因子,所以。
又因爲要滿足,即必然要至少存在一個,所以。
換言之:至少要有一個,以滿足的要求;至多有兩個包含,以滿足的要求。
因而基本的組合方式爲,的取值範圍爲。
而因爲和是不同的方法,所有滿足要求的方法中,除了和各有3種排列之外,其餘都有6種排列。
對於某一個素因子總的方法數爲。
最終答案。
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/