此题是一道小绿题,主要知识面是数学(其实就是利用lcm和gcd的性质推隐藏条件),本来此题的考点就在于你找不到隐藏条件,但是神奇的是我把所有东西推出来了之后,不知道找因子…因为题目给出的是1e9的数据范围,而我想到的找因子的办法就是从1遍历到 1e9/2的数,判断是否整除,从而找到因子,所以分析一波时间复杂度,直接爆炸,就一直卡在这个鬼地方。
现在想想,只能说我是傻子…
现在划重点,找 n 的因子,只用从1 遍历到 sqrt(n)
就行了。如果n%i==0
那么一定存在n%(n/i)==0
所以你只用找到sqrt(n)
之前的所以因子,也就找到了sqrt(n)
之后的所有因子,那么处理1e9的数只用遍历 1e3的范围。如此一看,时间复杂度十分合理。
传送门:P1072
AC 代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int ans=0;
int a1,a2,b1,b2;
cin>>a1>>a2>>b1>>b2;
for(int i=1;i*i<=b2;i++)
{
if(b2%i==0)
{
int t1=i,t2=b2/i;
if(t1==t2)
{
if(t1%a2==0)
{
if(__gcd(t1/a2,a1/a2)==1&&__gcd(b2/b1,b2/t1)==1)
ans++;
}
}
else
{
if(t1%a2==0)
{
if(__gcd(t1/a2,a1/a2)==1&&__gcd(b2/b1,b2/t1)==1)
ans++;
}
if(t2%a2==0)
{
if(__gcd(t2/a2,a1/a2)==1&&__gcd(b2/b1,b2/t2)==1)
ans++;
}
}
}
}
cout<<ans<<endl;
}
return 0;
}