当前位置: 代码迷 >> 综合 >> Hankson 的趣味题
  详细解决方案

Hankson 的趣味题

热度:57   发布时间:2023-11-08 02:01:38.0

lcm(b,x)=dlcm(b,x)=dlcm(b,x)=d可知xxx一定整除ddd,即xxx一定是ddd的约束。通过试除法,我们可以在O(sqrt(N))O(sqrt(N))O(sqrt(N))内求出所有ddd的约数,逐一判断是否满足题意即可。
总时间复杂度O(n?sqrt(d)?logd)O(n*sqrt(d)*logd)O(n?sqrt(d)?logd)

// luogu-judger-enable-o2
#include <iostream>
using namespace std;
long long n;
long long a,b,c,d;
int tot;
long long ans[200010];
void pri(long long n)
{for(int i=1;i*i<=n;i++){if(!(n%i)) {ans[++tot]=i;if(n/i!=i) ans[++tot]=n/i;}}
}
long long gcd(long long a,long long b)
{return b?gcd(b,a%b):a; 
}
long long lcm(long long a,long long b)
{return a*b/gcd(a,b);
}
int nod;
int main()
{cin>>n;while(n--){tot=0;cin>>a>>c>>b>>d;pri(d);nod=0;for(int i=1;i<=tot;i++){if(gcd(ans[i],a)==c&&lcm(ans[i],b)==d){nod++;	}}cout<<nod<<endl;}
}