luoguP1072 【Hankson 的趣味题】

题目描述

(由于本题是数论题,所以我只把题目大意说一下。。。)
输入时给定\(a_0,a_1,b_0,b_1\),题目要求你求出满足如下条件的\(x\)的个数:
\[\begin{cases}\gcd(a_0,x)=a_1 \cdots\cdots 1 \\ \operatorname{lcm}(b_0,x)=b_1 \cdots\cdots2\end{cases}\]


基本思路

先上一波推导:
我们很容易可以得到:
\[\gcd(a \times d,b \times d)=d \times \gcd(a,b)\]
所以根据这个规律以及\(\gcd\)的定义,由\(1\)式可知:
\[\gcd(a_0/a_1,x/a_1)=1 \cdots\cdots 3\]
根据\(\operatorname{lcm}\)的定义:
\[\operatorname{lcm}(a,b)=a \times b/\gcd(a,b)\]

\[\gcd(a,b)=a \times b/\operatorname{lcm}(a,b)\]
所以由\(2\)式可得:
\[\gcd(b_0,x)=b_0 \times x/b_1\]
进行类似于对\(1\)式的变换:
\[\gcd(b_1/x,b_1/b_0)=1 \cdots\cdots4\]
联立\(3\)式和\(4\)式:
\[\begin{cases}\gcd(a_0/a_1,x/a_1)=1\\ \gcd(b_1/x,b_1/b_0)=1\end{cases} \cdots\cdots5\]
还可以观察到:
\[\begin{cases}a_1|x\\x|b_1\end{cases} \cdots\cdots6\]
所以我们便得到了一种方法:\(O(\sqrt{N})\)扫一遍\(b_1\)的约数判断是否满足\(5\)式和\(6\)式,统计答案


细节注意事项

在扫描\(b_1\)的约数时,会得到两个约数:\(x\)\(b_1/x\)特别注意当\(x=b_1/x\)\(x^2=b_1\)时合法的\(x\)只计算一次。


参考代码

#include<cstdio>
#define rg register
inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
template <typename T> inline T read(){
    T s=0;bool f=false;char c=getchar();
    while(c<'0'||c>'9')f|=(c=='-'),c=getchar();
    while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
    return (f)?(-s):(s);
}
int main(){
    int T=read<int>();
    while(T--){
        int a0=read<int>(),a1=read<int>();
        int b0=read<int>(),b1=read<int>();
        int tmp1=a0/a1,tmp2=b1/b0,ans=0;
        for(rg int x=1;x*x<=b1;x++)
            if(b1%x==0){
                int y=b1/x;
                if(x%a1==0&&gcd(x/a1,tmp1)==1&&gcd(tmp2,b1/x)==1) ans++;
                if(x==y) continue;
                if(y%a1==0&&gcd(y/a1,tmp1)==1&&gcd(tmp2,b1/y)==1) ans++;
            }
        printf("%d\n",ans);
    }
    return 0;
}

完结撒花\(qwq\)

转载于:https://www.cnblogs.com/zsbzsb/p/11020772.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值