NC16610 [NOIP2009]Hankson的趣味题
题目链接
关键点:
1、根据题目要求求gcd(x, a0) = a1, lcm(x, b0) = b1;那么b1%x == 0
所以可以枚举b1的因子作为x,然后验证gcd(x, a0) = a1, lcm(x, b0) = b1是否符合
2、减少复杂度:循环sqrt(b1)次,找到i为b1的因子,说明b1/i如果不为i,那么也为b1的因子
3、求lcm时计算a*b,所以要开long long,也可以不开,就将运算顺序调换,lcm(a, b) = a/gcd(a, b)*b;
完整代码:
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t, a0, a1, b0, b1, ans;
ll gcd(int a, int b)
{
if (b == 0)
return a;
else
return gcd(b, a%b);
}
ll lcm(int a, int b)
{
return a*b/gcd(a, b);
}
int main()
{
cin>>t;
while (t--)
{
cin>>a0>>a1>>b0>>b1;
ans = 0;
for (ll i=1; i*i<=b1; i++)
{
if (b1%i == 0)
{
if (gcd(i, a0) == a1 && lcm(i, b0) == b1)
ans++;
if (b1/i!=i)
{
if (gcd(b1/i, a0) == a1 && lcm(b1/i, b0) == b1)
ans++;
}
}
}
cout<<ans<<endl;
}
return 0;
}