[BOJ] 1629번 | κ³±μ…ˆ (C++)

2023. 9. 1. 14:30ㆍCoding Test/BOJ

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

1629번: κ³±μ…ˆ

첫째 쀄에 A, B, Cκ°€ 빈 칸을 사이에 두고 μˆœμ„œλŒ€λ‘œ 주어진닀. A, B, CλŠ” λͺ¨λ‘ 2,147,483,647 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

www.acmicpc.net

 

πŸ§‘πŸ»‍πŸ’»ν’€μ΄ κ³Όμ •

처음 문제λ₯Ό 봀을 λ•ŒλŠ” λ¬Έμ œκ°€ μ›ν•˜λŠ” 게 뭐길래 싀버 1일까 μƒκ°ν–ˆλŠ”λ°, 주어진 숫자 λ²”μœ„κ°€ λͺ¨λ‘ μ΅œλŒ€ 2,147,483,647μ΄λ”κ΅°μš”... 즉, \(O(n)\) μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μž‘μ„±ν•˜κ²Œ 되면 μ΅œλŒ€ 2,147,483,647(21μ–΅) 번 돌기 λ•Œλ¬Έμ—, μ‹œκ°„ λ‚΄λ‘œ μ ˆλŒ€ λͺ» ν†΅κ³Όν•©λ‹ˆλ‹€.

 

\( O(logN) \) μ •λ„λŠ” λ˜μ–΄μ•Ό ν’€ 수 μžˆμ„ν…λ°, μ–΄λ–»κ²Œ ν• κΉŒ ν•˜λ‹€κ°€ μ €λŠ” 2κ°œμ”© λ¬ΆλŠ” 방법을 μ„ νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2κ°œμ”© 묢게 되면, λ‹€μŒ 두 가지 상황을 μ§λ©΄ν•˜κ²Œ λ©λ‹ˆλ‹€.

  • Bκ°€ 짝수일 경우  \( \rightarrow \)  λ‚¨λŠ” 것 없이 λͺ¨λ‘ λ¬Άμ΄λ―€λ‘œ κ·ΈλŒ€λ‘œ 진행
  • Bκ°€ ν™€μˆ˜μΌ 경우  \( \rightarrow \)  1κ°œκ°€ λ‚¨μœΌλ―€λ‘œ, λ³„λ„λ‘œ κ³±ν•΄μ£ΌκΈ°

 

κ°€λ Ή 6을 11번 κ±°λ“­μ œκ³±ν•΄μ•Ό ν•˜λŠ” 상황을 μ˜ˆμ‹œλ‘œ λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

6 6 6 6 6 6 6 6 6 6 6

 

6을 두 κ°œμ”© 묢으면 총 5개둜, 6이 ν•˜λ‚˜κ°€ λ‚¨λŠ” 상황이 λ©λ‹ˆλ‹€.

(6 6) (6 6) (6 6) (6 6) (6 6) 6

 

즉, \( 6 \times 6 = 36 \)이 5κ°œκ°€ μƒκΈ°κ²Œ λ©λ‹ˆλ‹€. ν•˜λ‚˜ 남은 6은 λ³„λ„λ‘œ κ³±ν•΄μ£ΌκΈ°λ‘œ ν•˜κ³ , 36을 λ‹€μ‹œ 두 κ°œμ”© λ¬ΆμŠ΅λ‹ˆλ‹€.

그러면 \( 36 \times 36 = 1296 \)이 2κ°œκ°€ μƒκΈ°κ²Œ 되고, 36이 ν•˜λ‚˜ λ‚¨κ²Œ λ©λ‹ˆλ‹€.

(1296) (1296) 36

 

λ§ˆμ°¬κ°€μ§€λ‘œ 36도 λ‚˜μ€‘μ— λ³„λ„λ‘œ κ³±ν•΄μ£ΌκΈ°λ‘œ ν•˜κ³ , λ‹€μ‹œ 2κ°œμ”© λ¬Άμ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

2개 λ‚¨μ•˜μœΌλ―€λ‘œ 1κ°œλ°–μ— μƒμ„±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

1679616

 

이 μˆ«μžμ— μ•„κΉŒ λ³„λ„λ‘œ λ‚¨μ•˜λ˜ 6, 36을 κ³±ν•΄μ£Όλ©΄ κ±°λ“­μ œκ³± μ΅œμ’… κ²°κ³Όκ°€ λ‚˜μ˜€κ²Œ λ©λ‹ˆλ‹€.

1679616 * 6 * 36

 

λ¬Όλ‘  μ˜€λ²„ν”Œλ‘œμš°κ°€ λ˜μ§€ μ•Šλ„λ‘, 쀑간 μ—°μ‚° κ³Όμ •λ§ˆλ‹€ % Cλ₯Ό ν•΄μ£ΌλŠ” 것을 μžŠμ§€ 말아야 ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 과정을 λ°˜λ³΅ν•˜μ—¬ 닡을 ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

βœοΈμ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

#include <iostream>
#include <vector>
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
using namespace std;
using uint64 = unsigned long long;

uint64 Pow(uint64 A, int B, const int C)
{
    if (B <= 1)
        return A % C;  // (A:4, B:1, C:2)와 같은 μž…λ ₯도 μ‘΄μž¬ν•˜λ―€λ‘œ

    int numCount = B / 2;
    int mod = B % 2;

    uint64 square = (A * A) % C;
    uint64 modNum = (mod == 0) ? 1 : A;
    
    return (modNum * Pow(square, numCount, C)) % C;
}

int main()
{
    FAST_IO
    int A, B, C;
    cin >> A >> B >> C;

    uint64 answer = Pow(A, B, C);
    cout << answer;
    return 0;
}

 

728x90
λ°˜μ‘ν˜•