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

題面傳送門

吐槽一句,這麼的題目能搞成藍色???

好了,進入正題:

思路

首先,列出式子:
{gcd(x,a0)=a1lcm(x,b0)=b1 \left\{ \begin{aligned} \gcd(x,a_0)=a_1\\ lcm(x,b_0)=b_1 \end{aligned} \right.

那麼,先來看第一個式子:

gcd(x,a0)=a1\gcd(x,a_0)=a_1,設k0=x÷a1,k1=a0÷a1k_0=x\div a_1,k_1=a_0\div a_1

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

證明:

如果gcd(k0,k1)=t,t>1\gcd(k_0,k_1)=t,t>1,設k0=t×w0,k1=t×w1k_0=t\times w_0,k_1=t\times w_1

所以{x=t×w0×a1a0=t×w1×a1 \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,a0)=a1×t\gcd(x,a_0)=a_1\times t了,所以tt定爲11

然後,再看第二個式子:

lcm(x,b0)=b1lcm(x,b_0)=b_1,設k0=b1÷x,k2=b1÷b0k_0=b_1\div x,k_2=b_1\div b_0,同樣可以得出gcd(k0,k1)=1\gcd(k_0,k_1)=1

證明:

gcd(k0,k1)=t,t>1\gcd(k_0,k_1)=t,t>1,設k0=t×w0,k1=t×w1k_0=t\times w_0,k_1=t\times w_1

{x=b1t×w0b0=b1t×w1\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,b0)=t×w0×w1\gcd(x,b_0)=t\times w_0\times w_1,所以,tt定爲11

所以,爲了滿足那個式子,就要{gcd(x÷a1,a0÷a1)=1gcd(b1÷x,b1÷b0)=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.
所以,xx就是b1b_1的因數,只要從11b1\sqrt{b_1},枚舉,然後看看符不符合,這裏還有一個潛在的條件,題目中給了我們:輸入數據保證 a0a_0 能被 a1a_1 整除,b1b_1 能被 b0b_0 整除,所以後面的a0÷a1a_0\div a_1b1÷b0b_1\div b_0一定是整數,不用管,就要看看x÷a1x\div a_1b1÷xb_1\div x是否爲整數就可以了。

代碼

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章