洛谷——U10783 名字被和谐了

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 }

 

posted @ 2017-08-10 21:36  Aptal丶  阅读(266)  评论(0编辑  收藏  举报