PS/BOJ

[백준 BOJ] 1629 곱셈

Jubil 2018. 11. 11. 16:49
반응형

1629_곱셈

링크

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

 

풀이


 

b 21억까지기 때문에 곱하고 나머지 구하기를 반복하다 보면 시간을 초과하게 됩니다. 그래서 지수법칙을 이용하기로 했습니다.

 


 

제곱한 걸 다시 제곱하면 네 제곱이 되고 또 제곱하면 여덟 제곱이 되는 것을 이용하는 것입니다.

아홉 제곱을 구하기 위해서는 첫 번째 수 a를 다시 곱하면 됩니다.

이렇게 제곱과 첫 번째 수를 곱함으로써 b 제곱을 만들면 됩니다.

하지만 그 방법은 다운탑이므로 탑다운으로 과정을 구하고 난 후 쌓아 올려줍니다.

 

이런 방식으로 코드를 짜면 log2n으로 구할 수 있겠네요.

 

코드

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

//1629_곱셈

#include <cstdio>

#include <stack>

using namespace std;

 

int a, b, c;

long long int ans;

stack<int> stk;

 

int main() {

    scanf("%d %d %d"&a, &b, &c);

 

    ans = a;

 

    while (true) {                        //탑다운으로 제곱, a 곱한 과정을 구함

        if (b == 1break;

 

        if (b % 2 == 0) stk.push(0);

        else stk.push(1);

 

        b /= 2;

    }

 

    while (true) {                        //다운탑으로 b제곱을 만듦

        if (stk.empty()) break;

 

        if (stk.top() == 0) ans = ans * ans % c;

        else ans = (ans * ans % c) * a % c;

 

        stk.pop();

    }

 

    printf("%lld\n", ans % c);

 

    return 0;

}

Colored by Color Scripter

cs



반응형

'PS > BOJ' 카테고리의 다른 글

[백준 BOJ] 1297 TV 크기  (1) 2018.11.13
[백준 BOJ] 9506 약수들의 합  (0) 2018.11.12
[백준 BOJ] 1964 오각형, 오각형, 오각형...  (0) 2018.11.10
[백준 BOJ] 2864 5와 6의 차이  (0) 2018.11.09
[백준 BOJ] 1100 하얀 칸  (0) 2018.11.08