BOJ

백준 1629 - 곱셈

yanJuicy 2019. 5. 16. 06:45
반응형

문제

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

 

1629번: 곱셈

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

www.acmicpc.net

 

풀이

A를 B번 곱한후 C로 나누는 시도를 하면 시간도 초과할 수 있고, 연산 값도 엄청나게 커져서 결과가 제대로 안나온다. B가 엄청나게 커지면 곱셈하는데 시간을 다 소모하게 된다. 다음과 같은 나머지 연산에 대한 공식이 있다.

A * B % C = (A % C) * (B % C) % C 

 

그리고 곱셈 연산의 수를 줄이기 위해 다음과 같은 규칙을 이용한다.

10 ^ 10 = (10 ^ 5)의 제곱 , 지수가 짝수일 경우

10 ^ 11 = (10 ^ 5)의 제곱 * 10 , 지수가 홀수일 경우

이 규칙을 이용하면 곱셈 연산의 회수를 대폭 줄일 수 있다.

 

위의 공식과 규칙을 이용하여 문제를 해결한다. power(num, n) 함수를 이용한다. num에는 곱할 수를 n에는 지수를 넣어준다. n/2를 반복해서 해주면서 문제를 분할한다. n%2 == 0 이면 지수가 짝수이다. 지수가 짝수일때는 tmp * tmp % C를 해주면 된다. n%2 == 1이면 지수가 홀수이다. 지수가 홀수 일때는 짝수인 경우인 tmp * tmp % C 뒤에 * num % C가 남아있으므로 함께 계산해주면 된다.

 

코드

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
#include <iostream>
using namespace std;
 
int A, B, C;
 
long long power(int num, int n)
{
    if (n == 0return 1;
 
    long long tmp = power(num, n / 2);
    
    if (n % 2)
        return ((tmp * tmp) % C) * num % C;
    else
        return (tmp * tmp) % C;
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    cin >> A >> B >> C;
    cout << power(A, B);
 
    return 0;
}
 
cs

 

 

반응형

'BOJ' 카테고리의 다른 글

백준 1473 - 음식물 피하기  (0) 2019.05.23
백준 1012 - 유기농 배추  (0) 2019.05.18
백준 9465 - 스티커  (0) 2019.05.14
백준 10448 - 유레카 이론  (0) 2019.05.14
백준 1463 - 1로 만들기  (0) 2019.05.12