題面傳送門
吐槽一句,這麼水的題目能搞成藍色???
好了,進入正題:
思路
首先,列出式子:
{gcd(x,a0)=a1lcm(x,b0)=b1
那麼,先來看第一個式子:
gcd(x,a0)=a1,設k0=x÷a1,k1=a0÷a1
可以很快得出,gcd(k0,k1)=1
證明:
如果gcd(k0,k1)=t,t>1,設k0=t×w0,k1=t×w1
所以{x=t×w0×a1a0=t×w1×a1
那麼gcd(x,a0)=a1×t了,所以t定爲1
然後,再看第二個式子:
lcm(x,b0)=b1,設k0=b1÷x,k2=b1÷b0,同樣可以得出gcd(k0,k1)=1
證明:
若gcd(k0,k1)=t,t>1,設k0=t×w0,k1=t×w1
則⎩⎪⎪⎨⎪⎪⎧x=t×w0b1b0=t×w1b1
那麼,gcd(x,b0)=t×w0×w1,所以,t定爲1
所以,爲了滿足那個式子,就要{gcd(x÷a1,a0÷a1)=1gcd(b1÷x,b1÷b0)=1
所以,x就是b1的因數,只要從1到b1,枚舉,然後看看符不符合,這裏還有一個潛在的條件,題目中給了我們:輸入數據保證 a0 能被 a1 整除,b1 能被 b0 整除,所以後面的a0÷a1和b1÷b0一定是整數,不用管,就要看看x÷a1和b1÷x是否爲整數就可以了。
代碼
#include<bits/stdc++.h>
using namespace std;
int n;
int a0,a1,b0,b1;
int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
int main(){
scanf("%d",&n);
while(n--){
scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
int ans=0;
for(int i=1;i*i<=b1;i++){
if(b1%i==0){
if(i%a1==0&&gcd(i/a1,a0/a1)==1&&gcd(b1/i,b1/b0)==1)ans++;
if(i!=b1/i&&b1/i%a1==0&&gcd(b1/i/a1,a0/a1)==1&&gcd(b1/(b1/i),b1/b0)==1)ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
謝謝–zhengjun