레야몬
[C++] 1629번 곱셈 - 수학, 분할 정복 본문
#include <iostream>
using namespace std;
typedef unsigned long long int lld;
lld a, b, c; //A를 B번 곱한 수를 C로 나눈 나머지
lld f(int n)
{
lld ret;
if(n==1)
return a;
else {
lld tmp = f(n/2)%c;
ret = tmp*tmp%c; //분할 정복하기
if(n%2) //2로 나눴을 때 나머지가 있으면 a를 한 번 더 곱해야 함
ret=(ret*(a%c))%c;
return ret;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cout.tie(NULL); cin.tie(NULL);
cin >> a >> b >> c;
a%=c;
cout << f(b);
return 0;
}
여기서 주의 할 점은 분할 정복 과정에서 long long int 범위를 넘어가면 안된다는 것이다. 특히 제곱이라서 해서 pow()함수를 쓰면 안되는데 왜냐하면 pow()함수의 반환 값의 형태는 double이라서 long long int보다 범위가 작기 때문에 오버 플로우가 일어날 수 있기 때문이다. 직접 두 번 곱하자!
<C++ pow()>
https://blockdmask.tistory.com/307
[C언어/C++] pow, sqrt 함수에 대해서(루트함수, 제곱, 제곱근)
안녕하세요. BlockDMask 입니다 오늘은 (저는) 자주 쓰지는 않지만 꼭 알아둬야하는 함수를 두개 묶어서 가지고왔습니다. 바로 pow, sqrt 함수인데요. 중학교때 제곱과 제곱근(루트) 배우셨죠? 그걸이
blockdmask.tistory.com
※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 1865번 웜홀 - 벨만포드 (0) | 2022.09.01 |
---|---|
[C++] 1753번 최단경로 - 다익스트라 (0) | 2022.09.01 |
[C++] 1167번 트리의 지름 - 그래프 이론, BFS (1) | 2022.08.31 |
[C++] 18870번 좌표 압축 - 정렬, 값/좌표 압축 (0) | 2022.08.31 |
[C언어] 11726번 2×n 타일링 - DP, 행렬 (0) | 2022.08.30 |
Comments