https://www.luogu.org/problem/show?pid=U10783
题目背景
众所周知,我们称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
先求出最大公约数,可以考虑从最大公约数gcd 的约数里找次大公约数
从2枚举 遇到第一个 能被gcd整除的 就可以返回 与gcd/i了 意会一下~~~
1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 int ch,a,b; 7 void read(int &x) 8 { 9 x=0;ch=getchar(); 10 for(;ch>'9'||ch<'0';) ch=getchar(); 11 for(;ch>='0'&&ch<='9';ch=getchar()) x=ch-'0'+x*10; 12 } 13 14 int GCD(int a,int b) 15 { 16 return !b?a:GCD(b,a%b); 17 } 18 int SGCD(int x) 19 { 20 for(int i=2;i*i<=x;i++) 21 if(x%i==0) return x/i; 22 return 1; 23 } 24 25 int main() 26 { 27 read(a); read(b); 28 int gcd=GCD(a,b); 29 if(gcd==1) printf("-1"); 30 else printf("%d",SGCD(gcd)); 31 return 0; 32 }