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 == 1) break;
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; } |
'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 |