#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a0, a1, b0, b1;
int gcd(int a, int b)
{
if (b == 0)return a;
return gcd(b, a%b);
}
bool check(int x)
{
if (x % a1 != 0)return false;
if (gcd(x / a1, a0 / a1) == 1 && gcd(b1 / b0, b1 / x) == 1)return true;
return false;
}
int main()
{
int n;
cin >> n;
for (int i = 0;i < n;i++)
{
long long ans = 0;
cin >> a0 >> a1 >> b0 >> b1;
for (int j = 1;j*j <= b1;j++)
{
if (b1%j == 0)
{
if (check(j))ans++;
if (b1 / j != j&&check(b1 / j))ans++;
}
}
cout << ans << endl;
}
return 0;
#include<cstdio>
#include<algorithm>
using namespace std;
int a0, a1, b0, b1;
int gcd(int a, int b)
{
if (b == 0)return a;
return gcd(b, a%b);
}
bool check(int x)
{
if (x % a1 != 0)return false;
if (gcd(x / a1, a0 / a1) == 1 && gcd(b1 / b0, b1 / x) == 1)return true;
return false;
}
int main()
{
int n;
cin >> n;
for (int i = 0;i < n;i++)
{
long long ans = 0;
cin >> a0 >> a1 >> b0 >> b1;
for (int j = 1;j*j <= b1;j++)
{
if (b1%j == 0)
{
if (check(j))ans++;
if (b1 / j != j&&check(b1 / j))ans++;
}
}
cout << ans << endl;
}
return 0;
}
从题解上看来的,感觉比枚举质因数方便的多,也可以过,主要中间那个x%a1开始写错了,调了半个小时才找到错误。
其实就是枚举,用到了一个新的东西,速度比gcd快了很多,算得上是gcd的一个优化
其实就是gcd(x/a1,a0/a1)==1 等同于gcd(x,a0)==a1
还有就是最小公倍数 b0*x/gcd(b0,x) 等同于(b1/x,b1/b0)==1
对于gcd可是优化了不少