문제
자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
출력
첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.
나의 답
#include <bits/stdc++.h>
using namespace std;
unsigned long long cal(unsigned long long A, int B, unsigned long long C) {
if(B==0) {
return (unsigned long long)1;
}
else {
unsigned long long result = cal(A, B/2, C);
result *= result;
result %= C;
if(B%2==1) {
result *= A;
result %= C;
}
return result;
}
}
int main(void) {
unsigned long long A, C, result;
int B;
scanf("%llu%d%llu",&A,&B,&C);
result = cal(A, B, C);
printf("%llu\n",result);
return 0;
}
해설
x^2n = x^n * x^n이다. 따라서 x^B/2의 값을 알고 있다고 가정한다면 x^B의 값을 구할 수 있다. 만약 B가 홀수이면 B/2에서 1이 누락되기 때문에 A를 한 번 더 곱해준다.
'백준' 카테고리의 다른 글
[16431번] 베시와 데이지 (0) | 2020.05.03 |
---|---|
[9461번] 파도반 수열 (0) | 2020.05.03 |
[2875번] 대회 or 인턴 (0) | 2020.05.03 |
[1110번] 더하기 사이클 (0) | 2020.05.03 |
[1085번] 직사각형에서 탈출 (0) | 2020.05.03 |