#문제

https://www.acmicpc.net/problem/2981

 

2981번: 검문

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

www.acmicpc.net

 

#작성 코드

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
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
 
int n;
int num[100];
vector<int> prime;
 
int gcd(int a, int b){
    return a%b?gcd(b, a%b):b;
}
 
int main(){
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>num[i];
    }
    sort(num, num+n);
    int Gcd = num[1]-num[0];    
    for(int i=2; i<n; i++){
        Gcd = gcd(Gcd, num[i]-num[i-1]);
    }
 
    // 최대공약수의 약수 찾기!!
    // 약수를 찾으면 하나씩 prime 벡터에 넣는다. 
    for(int i=1; i*i<=Gcd; i++){
        if( Gcd%i==0 ){
            prime.push_back(i);
            if( i==1 ) prime.pop_back();
            if(Gcd/i==i) continue;
            prime.push_back(Gcd/i);
        }
    }
    sort(prime.begin(), prime.end());
    for(int i=0; i<prime.size(); i++){
        cout<<prime[i]<<' ';
    }
    return 0;
}
cs

##

입력받은 숫자를 a0, a1, ... an-1이라고 하면 m이 하나 이상 존재하는 입력이 들어오므로

a0 = m*b0 + d

a1 = m*b1 + d

...

an-1 = m*bn-1 + d

의 꼴이 된다.

따라서 an-1 - an-2 = m(bn-1 - bn-2), ... , a1-a0 = m(b1-b0) 이 되므로

i=1 ~ n-1에서 ai-ai-1들의 최대공약수를 구하면 모든 ai에 대해 m*bi를 나눠떨어지도록 하는 수가 된다.

그 최대 공약수를 k라고 하면, k의 약수들도 m*bi를 나눠떨어지게 할 수 있다.

=> k를 구하고, k의 약수들을 오름차순으로 출력하면 되는 문제.

'BOJ' 카테고리의 다른 글

BOJ 10845번 :: 큐  (0) 2019.12.22
BOJ 4949번 :: 균형잡힌 세상  (0) 2019.12.22
BOJ 10217번 :: KCM Travel  (0) 2019.12.21
BOJ 11653번 :: 소인수분해  (0) 2019.12.21
BOJ 11404번 :: 플로이드  (0) 2019.12.20

+ Recent posts