题目链接: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/