#BOJ 1629 곱셈

Wonder_Why (Today I learned)·2022년 1월 17일
0

BOJ

목록 보기
34/70

곱셈

시간 제한	      메모리 제한	제출	정답	맞힌 사람	정답 비율
0.5 초 (추가 시간 없음)	128 MB       	52968	13956	10237	25.684%

문제
자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.

예제 입력 1
10 11 12

예제 출력 1
4


먼저, python 으로 풀지 않는 이상 코드 내에서 변수들의 크기가 자료형의 범위를 훨씬 뛰어넘을 수 있다는 것을 주의해야한다. (int overflow 주의)
또한, 시간 제한이 0.5초로 주어졌는데 만약 거듭제곱을 for 문으로 계산해준다고 가정해보면 B가 가질 수 있는 값은 2,147,483,647이 최대이다. 대충 생각해보면 2,147,483,647 회만큼의 연산이 발생할 수 있고 이는 요구되는 시간 제한에 전혀 미치지 못한다.
~> 함수 재귀를 이용하는 분할정복(divide and conquer) 알고리즘을 이용하면 O(log N)의 시간 복잡도로 해결할 수 있다.


구현

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

ll pow(ll a, ll b, ll c)
{
	if (b == 1) return a%c;
	ll var = pow(a, b / 2, c);
	var = var * var % c;
	if (b % 2 == 0)return var;
	else return var*a% c;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	ll a, b, c;
	cin >> a >> b >> c;
	cout << pow(a, b, c) << endl;
	
	return 0;

}

profile
전자과 머학생

0개의 댓글