标签:ret 趣味 另一个 using mat lcm gcd code ble
题目链接
就是求
\(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;
}
标签:ret 趣味 另一个 using mat lcm gcd code ble
原文地址:https://www.cnblogs.com/ChrisKKK/p/11693217.html