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\n",ans);
	}
	return 0;
}
posted @ 2019-10-17 17:02  ChrisKKK  阅读(82)  评论(0编辑  收藏  举报