一道数论的题,我反正是直接朴素算法来得的50,因为我实在是不会推了。
数学不好我的错咯?
//对于两个正整数a,b,设 gcd(a,b)=k,则存在gcd(a/k,b/k)=1
//gcd(b1/b0,b1/x)=1
//用心体会这两个式子,发现 x 是 a1的整数倍且是 b1 的因子
//b√1 枚举 b1 的因子(也就是 x ),如果这个数是 a1 的整数倍,并且满足那两个式子,ans++
/*
gcd(x/a1,a0/a1)=1;
gcd(b1/b0,b1/x)=1;
*/
这就是数学家推出来的,至于为什么,我是真的不知道啊,艾哥我对不起你啊。
虽然我们现在学的解析几何
代码这道题推出来就简单了(说的倒是简单,Orz)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int gcd(int a,int b) {
return b==0?a:gcd(b,a%b);
}
int main(){
int n;
cin>>n;
while(n--){
int a0,a1,b1,b0;
cin>>a0>>a1>>b0>>b1;
int sum=0;
int b=b1/b0;
int a=a0/a1;
for(int x=1;x*x<=b1;x++)
if(b1%x==0){
if(x%a1==0&&gcd(x/a1,a)==1&&gcd(b,b1/x)==1) sum++;
int y=b1/x;
if(x==y) continue;
if(y%a1==0&&gcd(y/a1,a)==1&&gcd(b,b1/y)==1) sum++;
}
cout<<sum<<endl;
}
return 0;
}