πŸ•οΈ PS (BOJ)/Basic Math

[BOJ][C++] λ°±μ€€ 2981번: κ²€λ¬Έ

선달 2023. 1. 24. 03:55
λ°˜μ‘ν˜•

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

 

2981번: κ²€λ¬Έ

νŠΈλŸ­μ„ 타고 μ΄λ™ν•˜λ˜ μƒκ·Όμ΄λŠ” 경찰의 검문을 λ°›κ²Œ λ˜μ—ˆλ‹€. 경찰은 상근이가 μš΄λ°˜ν•˜λ˜ 화물을 ν•˜λ‚˜ν•˜λ‚˜ λͺ¨λ‘ 확인할 것이기 λ•Œλ¬Έμ—, κ²€λ¬Έν•˜λŠ”λ° μ—„μ²­λ‚˜κ²Œ 였랜 μ‹œκ°„μ΄ κ±Έλ¦°λ‹€. μƒκ·Όμ΄λŠ” μ‹œκ°„

www.acmicpc.net

 

문제

νŠΈλŸ­μ„ 타고 μ΄λ™ν•˜λ˜ μƒκ·Όμ΄λŠ” 경찰의 검문을 λ°›κ²Œ λ˜μ—ˆλ‹€. 경찰은 상근이가 μš΄λ°˜ν•˜λ˜ 화물을 ν•˜λ‚˜ν•˜λ‚˜ λͺ¨λ‘ 확인할 것이기 λ•Œλ¬Έμ—, κ²€λ¬Έν•˜λŠ”λ° μ—„μ²­λ‚˜κ²Œ 였랜 μ‹œκ°„μ΄ κ±Έλ¦°λ‹€.

μƒκ·Όμ΄λŠ” μ‹œκ°„μ„ λ•Œμš°κΈ° μœ„ν•΄μ„œ μˆ˜ν•™ κ²Œμž„μ„ ν•˜κΈ°λ‘œ ν–ˆλ‹€.

λ¨Όμ € κ·Όμ²˜μ— λ³΄μ΄λŠ” 숫자 N개λ₯Ό 쒅이에 μ λŠ”λ‹€. κ·Έ λ‹€μŒ, 쒅이에 적은 수λ₯Ό M으둜 λ‚˜λˆ„μ—ˆμ„ λ•Œ, λ‚˜λ¨Έμ§€κ°€ λͺ¨λ‘ κ°™κ²Œ λ˜λŠ” M을 λͺ¨λ‘ 찾으렀고 ν•œλ‹€. M은 1보닀 컀야 ν•œλ‹€.

N개의 μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, κ°€λŠ₯ν•œ M을 λͺ¨λ‘ μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 쒅이에 적은 수의 개수 N이 μ£Όμ–΄μ§„λ‹€. (2 ≤ N ≤ 100)

λ‹€μŒ 쀄뢀터 N개 μ€„μ—λŠ” 쒅이에 적은 μˆ˜κ°€ ν•˜λ‚˜μ”© μ£Όμ–΄μ§„λ‹€. 이 μˆ˜λŠ” λͺ¨λ‘ 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 1,000,000,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. 같은 μˆ˜κ°€ 두 번 이상 μ£Όμ–΄μ§€μ§€ μ•ŠλŠ”λ‹€.

항상 M이 ν•˜λ‚˜ 이상 μ‘΄μž¬ν•˜λŠ” 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

첫째 쀄에 κ°€λŠ₯ν•œ M을 곡백으둜 κ΅¬λΆ„ν•˜μ—¬ λͺ¨λ‘ 좜λ ₯ν•œλ‹€. μ΄λ•Œ, M은 μ¦κ°€ν•˜λŠ” μˆœμ„œμ΄μ–΄μ•Ό ν•œλ‹€.

 

풀이

a와 bλ₯Ό c둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ κ°™λ‹€λ©΄, a-bλŠ” c의 λ°°μˆ˜μ΄λ‹€.

이 힌트λ₯Ό 보고 문제λ₯Ό ν’€μ΄ν•˜μž

 

 

받은 μˆ˜λ“€μ˜ 차이듀을 μƒˆλ‘œμš΄ 벑터 vv 에 μ €μž₯ν•˜κ³ 

ν•΄λ‹Ή 벑터 vv의 μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•œλ’€,

μ΅œλŒ€κ³΅μ•½μˆ˜μ˜ μ•½μˆ˜λ“€μ„ κ΅¬ν•˜μ˜€λ‹€

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

int getGcd(int a, int b) {
    int tmp;
    while(a!=0) {
        tmp = b%a;
        b = a;
        a = tmp;
    }
    return b;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    
    // μž…λ ₯
    int n;
    cin >> n;
    vector<int> v(n);
    for(int i=0; i<n; i++)
        cin >> v[i];
    
    // vv[i] = v[i-1] - v[i-2]
    sort(v.begin(), v.end());

    vector<int> vv;
    for(int i=1; i<n; i++)
        vv.push_back(v[i]-v[i-1]);
    
    // μ΅œλŒ€κ³΅μ•½μˆ˜ κ΅¬ν•˜κΈ°
    sort(vv.begin(), vv.end());
    int gcd = vv[0];
    for(int i=1; i<vv.size(); i++)
        gcd = getGcd(gcd, vv[i]);
    

    // λ‚˜μ˜¨ μ΅œλŒ€ κ³΅μ•½μˆ˜μ˜ μ•½μˆ˜ κ΅¬ν•˜κΈ°
    vector<int> ans;
    for(int i=1; i<=sqrt(gcd); i++) {
        if(gcd % i != 0)
            continue;
        ans.push_back(i);
        if(i != gcd/i)
            ans.push_back(gcd/i);
    }
    sort(ans.begin(), ans.end());
    
    // 좜λ ₯
    for(int i=0; i<ans.size(); i++) {
        if(ans[i] == 1)
            continue;
        cout << ans[i] << " ";
    }
    
    return 0;
}

/*
 */
λ°˜μ‘ν˜•