[ABC142D] Disjoint Set of Common Divisors
首先我们知道,若一个数是另外两个数的公共因数,那么它肯定能整除另外两个数的最大公约数。
所以我们可以枚举最大公约数的质因数,再把这个质因数在最大公约数中除完,并且答案加一。
注意,要用 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;
}