题意:给出两个数a,b,问a和b的全部公约数是什么?
对于100%的数据,1 ≤ a,b ≤ 10^13
核心解法:两个数的最大公约数的因子一定是两个数的约数,但是求因子不会超过sqrt(k) (k=gcd(a,b)),但是在大于sqrt(k)小于k的数中还会有a,b的公约数,怎么办呢,时间不够遍历到k,所以这部分的数是k/(k的因子)得到数一定也是a,b的公约数。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
ll q[100100];
int main(){
ll a,b;
cin>>a>>b;
ll k=gcd(a,b);
int flag=0;
for(ll i=1;i<=sqrt(k);i++){
if(k%i==0){
q[flag++]=i;
if(i*i!=k)
q[flag++]=k/i;
}
}
sort(q,q+flag);
cout<<q[0];
for(int i=1;i<flag;i++){
cout<<" "<<q[i];
}
cout<<endl;
}