码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu_P1072 Hankson 的趣味题 gcd

时间:2019-10-17 17:14:03      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:ret   趣味   另一个   using   mat   lcm   gcd   code   ble   

Luogu_P1072 Hankson 的趣味题

### gcd

题目链接
就是求
\(gcd(x,a0)=a1\)
\(lcm(x,b0)=b1\)
\(x\)合法的数量
首先有一个很显然的等式
\(gcd(x/a1,a0/a1)=1\)
可以根据\(gcd\)的性质证出来
那么就剩下另一个等式了
\(lcm(x,b0)=x*b0/gcd(x,b0)\)
\(gcd(x,b0)=x*b0/b1\)
再根据第一个性质
\(gcd(x/(x*b0/b1),b0/(x*b0/b1))=gcd(b1/b0,b1/x)=1\)
其实上面的式子就等同于:
\(gcd(x/a1,a0/a1)=1\)
\(gcd(b1/b0,b1/x)=1\)
而且我们还知道x是b1的约数
那么就可以枚举b1约数然后验证符不符合两个式子
如果符合那么\(ans++\)


代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,ans=0;
inline int gcd(int x,int y){
    return y ? gcd(y,x%y) : x;
}
int main()
{
    scanf("%d",&n);
    while(n--){
        int a0,a1,b0,b1;ans=0;
        scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
        for(int x=1;x*x<=b1;x++) if(!(b1%x)){
            if(x%a1==0 && gcd(x/a1,a0/a1)==1 && gcd(b1/b0,b1/x)==1) ans++;
            int y=b1/x;
            if(x==y) continue;
            if(y%a1==0 && gcd(y/a1,a0/a1)==1 && gcd(b1/b0,b1/y)==1) ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

Luogu_P1072 Hankson 的趣味题 gcd

标签:ret   趣味   另一个   using   mat   lcm   gcd   code   ble   

原文地址:https://www.cnblogs.com/ChrisKKK/p/11693217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!