题目背景
众所周知,我们称g是a的约数,当且仅当g是正数且a mod g = 0。
众所周知,若g既是a的约数也是b的约数,我们称g是a、b的一个公约数。
众所周知,a、b最大的那个公约数就叫最大公约数。
题目描述
现在对于给定的两个正整数a、b,你需要求出它们次大的公约数(second greatest common divisor)。
输入输出格式
输入格式:第一行两个正整数数a、b。
输出格式:第一行一个数,表示a、b的次大公约数。若a、b的公约数只有一个,则输出-1。
输入输出样例
输入样例#1:
2 3
输出样例#1:
-1
说明
测试点1..4:a、b≤10^5
测试点1..10:1≤a、b≤10^9
分析
可以证明,a,b的所有公约数都被组大公约数所包含,都是最大公约数的因数,所以先求出最大公约数,然后在最大公约数中在找次大公约数。
code
1 #include<cstdio> 2 #include<algorithm> 3 4 using namespace std; 5 6 int Gcd(int x,int y) 7 { 8 if (y==0) return x; 9 return Gcd(y,x%y); 10 } 11 12 bool Isprime(int x) 13 { 14 for (int i=2; i*i<=x; ++i) 15 { 16 if (x%i==0) return false; 17 } 18 return true; 19 } 20 21 int main() 22 { 23 int d,x,y; 24 scanf("%d%d",&x,&y); 25 d = Gcd(x,y); 26 27 if (d==1) 28 { 29 printf("-1"); 30 return 0; 31 } 32 if (Isprime(d)) 33 { 34 printf("1"); 35 return 0; 36 } 37 for (int i=2; ; ++i) 38 { 39 if (d%i==0) 40 { 41 printf("%d",d/i); 42 return 0; 43 } 44 } 45 return 0; 46 }