大家好,欢迎来到IT知识分享网。
题目:http://www.luogu.org/problem/show?pid=1072#
分析:
1.gcd(x,a0)=a1;
gcd(x/a1,a0/a1)=1;
2.x*b0=b1*gcd(x,b0);
gcd(x,b0)=x*b0/b1;
gcd(b1/b0,b1/x)=1;
然后√n 枚举判断上述两个结论,欧几里得算法是logn,所以时间复杂度是√n*logn
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int ans;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int T,i,j,a0,a1,b0,b1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
//len=sqrt(b1+0.5);
ans=0;
for(i=1;i*i<=b1;i++)
{
if(b1%i==0){
if(i%a1==0&&(gcd(i/a1,a0/a1)==1)&&(gcd(b1/b0,b1/i)==1))
ans++;
j=b1/i;
if(j%a1!=0||i==j) continue;
if((gcd(j/a1,a0/a1)==1)&&(gcd(b1/b0,b1/j)==1))
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23665.html