SDJ( 수돈재 아님 ㅎ )

[C++] 2981 - 검문 본문

알고리즘/Backjoon

[C++] 2981 - 검문

ShinDongJun 2020. 1. 16. 23:51

문제 링크 : https://www.acmicpc.net/problem/2981

 

2981번: 검문

문제 트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 시간을 때우기 위해서 수학 게임을 하기로 했다. 먼저 근처에 보이는 숫자 N개를 종이에 적는다. 그 다음, 종이에 적은 수를 M으로 나누었을 때, 나머지가 모두 같게 되는 M을 모두 찾으려고 한다. M은 1보다 커야 한다. N개의 수가 주어졌을 때, 가능한 M을 모두 찾는

www.acmicpc.net

 

나는 이 문제를 다음과 같이 끄적거려서 해결했다.

 

어떤 수 두개 A, B( A < B )가 있을 때 m으로 나눈 나머지를 p라 하자. ( 나머지가 같다 )

그러면 다음과 같이 쓸 수 있을 것이다.

 

 

이 때 밑변을 상변으로 빼주면 다음과 같이 식이 나오게 된다

이 말은 B에서 A를 뺀 값이 어떤 수 m의 배수이고, 이 m으로 두 수를 나누게 될 경우 동일한 나머지가 나온다는 이야기다.

( A와 B가 동일한 나머지를 가지기 위해서는 (B-A)의 약수여야 한다. )

따라서 이 부분을 이용해 풀면 된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<bits/stdc++.h>
 
#define IO ios_base::sync_with_stdio(false); \
        cin.tie(NULL); \
        cout.tie(NULL); 
 
#define endl '\n'
 
using namespace std;
 
int X[105];
int B[10000];
int Blen;
int N, M;
 
int gcd(int a, int b)
{
    int n;
    while(b)
    {
        n = a%b;
        a = b;
        b = n;
    }
 
    return a;
}
 
int main(void)
{
    IO
    cin >> N;
 
    int stan;
 
    for(int i = 0; i < N; ++i)
        cin >> X[i];
 
    sort(X, X+N);
 
    stan = X[1]-X[0];
 
    for(int i = 2; i < N; ++i)
        stan = gcd(stan, X[i]-X[i-1]);
 
    for(int i = 1; i*<= stan; ++i)
    {
        if(stan % i == 0)
        {
            B[Blen++= i;
            if( i != stan/i)
                B[Blen++= stan/i;
        }
    }
 
    sort(B, B+Blen);
 
    for(int i = 1; i < Blen; ++i)
        cout << B[i] << endl;
 
    return 0;
}

'알고리즘 > Backjoon' 카테고리의 다른 글

[C++] 15918 - 랭퍼든 수열쟁이야!!  (0) 2020.01.20
[C++] 14925 - 목장 건설하기  (0) 2020.01.17
[C++] 17836 - 공주님을 구해라!  (0) 2020.01.15
[C++] 2780 - 비밀번호  (0) 2020.01.15
[Python3] 1793 - 타일링  (0) 2020.01.13
Comments