NOIP2009Hankson的趣味题

题目戳这里

分析


1.gcd


gcd(x,a0)=a1
{x=k1a1a0=k2a1

gcd(k1,k2)=1

简单证明:

假设 gcd(k1,k2)1

K=gcd(k1,k2)(K1)
{k1=pKk2=qK
{x=pKa1a0=qKa1
gcd(x,a0)=Ka1a1

这个结论与题目条件不符,所以 gcd(k1,k2)=1 成立

结合开始的式子,化简,得到 gcd(x/a1,a0/a1)=1

把这个结论推广一下,得到结论 P

对于两个正整数a,b,设 gcd(a,b)=k ,则存在 gcd(a/k,b/k)=1


2.lcm


lcm(x,b0)=b1
gcd(x,b0)=xb0/lcm(x,b0)=xb0/b1

由结论 P
gcd(x/(xb0/b1),b0/(xb0/b1))=1
化简得
gcd(b1/b0,b1/x)=1


3.gcd&&lcm


整理一下得到的重要的式子

{gcd(x/a1,a0/a1)=1gcd(b1/b0,b1/x)=1

用心体会这两个式子,发现 x a1的整数倍且是 b1 的因子
这个好像由 gcd 和 lcm 也可以得到?嗯,就这样。
于是得到了一种解题思路

b1 枚举 b1 的因子(也就是 x ),如果这个数是 a1 的整数倍,并且满足那两个式子,ans++


code:

#include<cstdio>
using namespace std;
int gcd(int a,int b) {
    return b==0?a:gcd(b,a%b);
}
int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
        int a0,a1,b0,b1;
        scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
        int p=a0/a1,q=b1/b0,ans=0;
        for(int x=1;x*x<=b1;x++) 
            if(b1%x==0){
                if(x%a1==0&&gcd(x/a1,p)==1&&gcd(q,b1/x)==1) ans++;
                int y=b1/x;//得到另一个因子
                if(x==y) continue; 
                if(y%a1==0&&gcd(y/a1,p)==1&&gcd(q,b1/y)==1) ans++;
            }
        printf("%d\n",ans);
    }
    return 0;
}
  • 26
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值