NOIP2009 Hankson 的趣味题

NOIP2009 Hankson 的趣味题题目: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

大家好,欢迎来到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

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信