[ABC142D] Disjoint Set of Common Divisors

发布时间 2023-08-08 08:08:50作者: Silver-Wolf

首先我们知道,若一个数是另外两个数的公共因数,那么它肯定能整除另外两个数的最大公约数。

所以我们可以枚举最大公约数的质因数,再把这个质因数在最大公约数中除完,并且答案加一。

注意,要用 long long 不然 int 溢出之后还在循环,就会导致超时。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int a,b,ans=1;
signed main() {
	cin>>a>>b;
	int k=__gcd(a,b);
	for(int i=2;i*i<=k;++i) {
		if(k%i)	continue;// 如果i不能整除a,b 
		while(k%i==0)	k/=i;// 把这个质因数除完 
		++ans;// 答案加一 
	}
	if(k!=1)	++ans;// 当a,b本来就互质时,再加一个答案 
	cout<<ans;
	return 0;
}