본문 바로가기

백준

28176 Maximum GCD

토요 라운드 끝나고 나서 힌트 받아가며 풀었던 문제

 

토요 라운드 중에 어느정도 감은 잡았다

 

10같은 경우를 예로 들면

10%10 = 0

10%9 = 1

10%8 = 2

10%7 = 3

10%6 = 4

10%5 = 0

 

최대 나올 수 있는 나머지 값이 4이다.

 3 7 10을 예로 들면 7과 10은 각각 1..3, 1..4까지 나머지를 만들 수 있으니 정답은 3이 된다.

 

이까지는 알겠는데 7 7 7 같은 경우나 2 4 8같은 경우를 어떻게 할지 몰라서 막혔다.

 

-> 결국 가장 작은 값을 가지고 최대공약수인지, 나머지로 만들 수 있는지 비교하면 된다

 

하지만 틀렸는데....

 

10 12 19의 경우 정답이 4인줄 알았는데 5여야 했다.

12 19로 5를 만들면 10 5 5여서 정답은 5가 된다.

 

그래서 확인해야 하는 게

- 자기자신(10)

- 자기 자신 외 가장 큰 약수(5)

위 경우가 아닌 경우 자기자신이 만들 수 있는 최대 나머지가 답이다

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>
#include<cassert>
#include <climits>
#include <tuple>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
#define MAXV 1e13 + 1
#define FOR(i, n) for(int i = 0; i < (n); ++i)

using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;

int n;
i64 v[100005];

i64 gcd(i64 a, i64 b){
    if(b == 0)
        return a;
    return gcd(b, a % b);
}

bool isGcd(i64 x) {
    FOR(i, n) {
        if (gcd(x, v[i]) == x)
            continue;
        if ((v[i]-1)/2 >= x)
            continue;
        return false;
    }
    return true;
}

int main() {
    scanf("%d", &n);
    
    i64 minv = MAXV;
	FOR(i, n) {
	    scanf("%lld", &v[i]);
	    minv = min(minv, v[i]);
	}
	
	if (isGcd(minv)) cout << minv;
	else if (isGcd(minv/2)) cout << minv/2; 
	else cout << (minv-1)/2;
    
	return 0;
}

 

 

 

 

'백준' 카테고리의 다른 글

18248 제야의 종  (1) 2023.10.07
7511 소셜 네트워킹 어플리케이션  (1) 2023.10.07
11607 Grid  (0) 2023.09.16
27113 잠입  (0) 2023.09.09
22956 소나기  (0) 2023.08.12