Luogu_P1072 Hankson 的趣味题 gcd

Luogu_P1072 Hankson 的趣味题

gcd


题目链接
就是求
(gcd(x,a0)=a1)
(lcm(x,b0)=b1)
(x)合法的数量
首先有一个很显然的等式
(gcd(x/a1,a0/a1)=1)
可以根据(gcd)的性质证出来
那么就剩下另一个等式了
(lcm(x,b0)=x*b0/gcd(x,b0))
(gcd(x,b0)=x*b0/b1)
再根据第一个性质
(gcd(x/(x*b0/b1),b0/(x*b0/b1))=gcd(b1/b0,b1/x)=1)
其实上面的式子就等同于:
(gcd(x/a1,a0/a1)=1)
(gcd(b1/b0,b1/x)=1)
而且我们还知道x是b1的约数
那么就可以枚举b1约数然后验证符不符合两个式子
如果符合那么(ans++)


代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,ans=0;
inline int gcd(int x,int y){
	return y ? gcd(y,x%y) : x;
}
int main()
{
	scanf("%d",&n);
	while(n--){
		int a0,a1,b0,b1;ans=0;
		scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
		for(int x=1;x*x<=b1;x++) if(!(b1%x)){
			if(x%a1==0 && gcd(x/a1,a0/a1)==1 && gcd(b1/b0,b1/x)==1) ans++;
			int y=b1/x;
			if(x==y) continue;
			if(y%a1==0 && gcd(y/a1,a0/a1)==1 && gcd(b1/b0,b1/y)==1) ans++;
		}
		printf("%d
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/ChrisKKK/p/11693217.html