洛谷 P1072 Hankson的趣味题题解--zhengjun

题面传送门

吐槽一句,这么的题目能搞成蓝色???

好了,进入正题:

思路

首先,列出式子:

\[\left\{ \begin{aligned} \gcd(x,a_0)=a_1\\ lcm(x,b_0)=b_1 \end{aligned} \right. \]

那么,先来看第一个式子:

\(\gcd(x,a_0)=a_1\),设\(k_0=x\div a_1,k_1=a_0\div a_1\)

可以很快得出,\(\gcd(k_0,k_1)=1\)

证明:

如果\(\gcd(k_0,k_1)=t,t>1\),设\(k_0=t\times w_0,k_1=t\times w_1\)

所以$$
\left{
\begin{aligned}
x=t\times w_0\times a_1\
a_0=t\times w_1\times a_1
\end{aligned}
\right.

\[那么$\gcd(x,a_0)=a_1\times t$了,所以$t$定为$1$ ### 然后,再看第二个式子: $lcm(x,b_0)=b_1$,设$k_0=b_1\div x,k_2=b_1\div b_0$,同样可以得出$\gcd(k_0,k_1)=1$ #### 证明: 若$\gcd(k_0,k_1)=t,t>1$,设$k_0=t\times w_0,k_1=t\times w_1$ 则$$\left\{ \begin{aligned} x=\dfrac{b_1}{t\times w_0}\\ b_0=\dfrac{b_1}{t\times w_1} \end{aligned} \right. \]

那么,\(\gcd(x,b_0)=t\times w_0\times w_1\),所以,\(t\)定为\(1\)

所以,为了满足那个式子,就要$$\left{
\begin{aligned}
\gcd(x\div a_1,a_0\div a_1)=1\
\gcd(b_1\div x,b1\div b_0)=1
\end{aligned}
\right.

\[所以,$x$就是$b_1$的因数,只要从$1$到$\sqrt{b_1}$,枚举,然后看看符不符合,这里还有一个潜在的条件,题目中给了我们:输入数据保证 $a_0$ 能被 $a_1$ 整除,$b_1$ 能被 $b_0$ 整除,所以后面的$a_0\div a_1$和$b_1\div b_0$一定是整数,不用管,就要看看$x\div a_1$和$b_1\div x$是否为整数就可以了。 ## 代码 ```cpp #include<bits/stdc++.h> using namespace std; int n; int a0,a1,b0,b1; int gcd(int x,int y){ return y==0?x:gcd(y,x%y); } int main(){ scanf("%d",&n); while(n--){ scanf("%d%d%d%d",&a0,&a1,&b0,&b1); int ans=0; for(int i=1;i*i<=b1;i++){ if(b1%i==0){ if(i%a1==0&&gcd(i/a1,a0/a1)==1&&gcd(b1/i,b1/b0)==1)ans++; if(i!=b1/i&&b1/i%a1==0&&gcd(b1/i/a1,a0/a1)==1&&gcd(b1/(b1/i),b1/b0)==1)ans++; } } printf("%d\n",ans); } return 0; } ``` # 谢谢--zhengjun\]

posted @ 2022-06-10 19:49  A_zjzj  阅读(34)  评论(0编辑  收藏  举报