# 본인 풀이
모듈로 연산 관련 공식을 까먹어서 그냥 바로 답안 확인했음
# 답안 및 로직
- 재귀적으로 제곱하면 시간복잡도가 O(N)에서 O(logN)으로 줄어든다. 로그의 밑은 2
- 모듈로 연산관련 공식은 다음과 같다.
(a+b) % c == ((a%c) + (b%c)) % c
(a*b) % c == (a%c * b%c) % c
이다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, b, c;
ll solution(ll a, ll b){
if (b==1){
return a % c;
}
ll ret = solution(a, b / 2);
ret = (ret * ret) % c;
// 홀수제곱 처리
if (b % 2) {
ret = (ret * a) % c;
}
return ret;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> a >> b >> c;
ll ret = solution(a, b);
cout << ret << "\n";
return 0;
}
long long
타입을 사용한다.solution
기저사례로 A%C 값을 넣어둔다.- 정수론 공식을 코드로 작성하고, 홀수처리만 추가로 진행한다.
# 복습 (7/17)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, b, c;
ll solution(int size){
if(size == 0){
return 1;
}
if(size == 1){
return a % c;
}
if(size % 2 == 1){
return ((a % c) * solution(size / 2) % c * solution(size / 2) % c) % c;
}else{
return (solution(size / 2) % c * solution(size / 2) % c) % c;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> a >> b >> c;
cout << solution(b) << "\n";
return 0;
}
- 재귀로 풀이
- 홀/짝 분기만 처리하고, size/2로 접근하여 log기반 복잡도로 풀이