πŸ•οΈ ICPC Sinchon/Basic Math

[BOJ][C++] λ°±μ€€ 20003번: κ±°μŠ€λ¦„λˆμ΄ μ‹«μ–΄μš”

선달 2023. 1. 24. 02:19
λ°˜μ‘ν˜•

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

 

20003번: κ±°μŠ€λ¦„λˆμ΄ μ‹«μ–΄μš”

ν”„λ‘œλΆˆνŽΈλŸ¬ μ§€μˆ˜λŠ” λ”± 떨어지지 μ•ŠλŠ” μˆ˜λŠ” μ§ˆμƒ‰μ΄λ‹€. κ±°μŠ€λ¦„λˆμ΄ λ‚¨λŠ” 것도 λ”± μ§ˆμƒ‰μ΄λ‹€. μ§€μˆ˜κ°€ μ•„μ΄ν…œμ„ 사렀 ν•˜λŠ”λ°, μ•„μ΄ν…œμ˜ 가격은 λ‹€ λΆ„μˆ˜λ‘œ 이루어져 μžˆλ‹€. μ§€κΈˆμ€ κ°€λ Ή, 3/2코인을 사렀

www.acmicpc.net

 

문제

ν”„λ‘œλΆˆνŽΈλŸ¬ μ§€μˆ˜λŠ” λ”± 떨어지지 μ•ŠλŠ” μˆ˜λŠ” μ§ˆμƒ‰μ΄λ‹€. κ±°μŠ€λ¦„λˆμ΄ λ‚¨λŠ” 것도 λ”± μ§ˆμƒ‰μ΄λ‹€. μ§€μˆ˜κ°€ μ•„μ΄ν…œμ„ 사렀 ν•˜λŠ”λ°, μ•„μ΄ν…œμ˜ 가격은 λ‹€ λΆ„μˆ˜λ‘œ 이루어져 μžˆλ‹€. μ§€κΈˆμ€ κ°€λ Ή, 3/2코인을 사렀고 2코인을 μ λ¦½ν•˜κ³  κ²°μ œν•˜λ©΄ 1/2코인이 λ‚¨μ•„λ²„λ¦¬λŠ” 것이닀. κ·Έλž˜μ„œ κ°œλ°œμ‚¬μ—κ²Œ λͺ¨λ“  μ•„μ΄ν…œμ„ λ”± λ–¨μ–΄μ§€κ²Œ λ‚˜λˆŒ 수 μžˆλŠ” 가격 λ‹¨μœ„λ₯Ό κ±΄μ˜ν•˜κΈ° μœ„ν•΄, μƒˆλ‘œμš΄ 가격 λ‹¨μœ„λŠ” μ΅œλŒ€ λͺ‡ 코인인지λ₯Ό κ΅¬ν•˜λ €κ³  ν•œλ‹€.

N개의 μ’…λ₯˜μ˜ μ•„μ΄ν…œμ„ λ”± λ–¨μ–΄μ§€κ²Œ λ‚˜λˆŒ 수 μžˆλŠ” 코인 λ‹¨μœ„λ₯Ό κ΅¬ν•˜λΌ. μ΄λ•Œ μ•„μ΄ν…œκ³Ό 코인은 λͺ¨λ‘ λΆ„μˆ˜ ν˜•νƒœλ‘œ λ‚˜μ™€μ•Ό ν•œλ‹€.

μž…λ ₯

첫 번째 μ€„μ—λŠ” μ•„μ΄ν…œμ˜ 개수 N (1 ≤ N ≤ 50)이 주어진닀.

두 번째 μ€„λΆ€ν„°λŠ” ν•œ 쀄에 λΆ„μž A, λΆ„λͺ¨ B (1 ≤ A, B ≤ 40) 쌍이 주어진닀. μ΄λŠ” κΈ°μ•½λΆ„μˆ˜ ν˜•νƒœκ°€ 아닐 μˆ˜λ„ μžˆλ‹€.

좜λ ₯

μƒˆλ‘œμš΄ 코인 λ‹¨μœ„μ˜ λΆ„μž, λΆ„λͺ¨λ₯Ό 곡백으둜 κ΅¬λΆ„ν•˜μ—¬ 좜λ ₯ν•œλ‹€. 단, κΈ°μ•½λΆ„μˆ˜ ν˜•νƒœμ΄λ‹€.

 

 

풀이

1. 각 λΆ„μˆ˜λ“€μ„ λΆ„λͺ¨μ˜ μ΅œμ†Œκ³΅λ°°μˆ˜λ‘œ 톡뢄

2. λΆ„μžλ“€μ˜ μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•΄μ„œ λ‹΅ λΆ„μˆ˜ κ΅¬ν•˜κΈ°

3. λ‹΅λΆ„μˆ˜ μ•½λΆ„

#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> ci;

ll getGcd(ll a, ll b) {
    ll tmp;
    while(b>0) {
        tmp = a%b;
        a = b;
        b = tmp;
    }
    return a;
}

ll getLcm(ll a, ll b) {
    return a / getGcd(a, b) * b;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    
    int n, a, b;
    ll gcd, lcm=1;
    cin >> n;
    vector<ci> v(n);
    for(int i=0; i<n; i++) {
        cin >> a >> b;
        lcm = getLcm(b, lcm);
        v[i] = {a,b};
    }
    
    // ν†΅λΆ„ν•˜μ—¬ λ‹€μ‹œ λ„£μ–΄μ£ΌκΈ°
    ll boonmo = lcm;
    for(int i=0; i<n; i++)
        v[i] = {lcm / v[i].second * v[i].first, boonmo};

    
    // λΆ„μžλ“€μ˜ μ΅œλŒ€κ³΅μ•½μˆ˜ ꡬ해주기
    ll boonja = v[0].first;
    for(int i=1; i<n; i++)
        boonja = getGcd(boonja, v[i].first);

    
    // μ•½λΆ„ν•˜κΈ°
    gcd = getGcd(boonmo, boonja);
    boonja /= gcd;
    boonmo /= gcd;
    cout << boonja << " " << boonmo;
    
    return 0;
}

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