관리 메뉴

민우의 코딩노트

1627번 곱셈 - C++ 본문

Algorithm/BOJ

1627번 곱셈 - C++

미미누 2022. 8. 4. 22:52

✅️[문제]
https://www.acmicpc.net/problem/1629

1629번: 곱셈

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

www.acmicpc.net


✅️[풀이]

재귀 문제이다!
재귀 문제를 풀때에는 수학적 귀납법을 이용하면 된다.
수학적 귀납법은 k=1이 성립하고, k와 k+1이 성립하면 식은 참이 된다.
이 문제에서 b가 1일때 나머지를 구할수 있고, 2b와 2b+1의 나머지를 구할 수 있다. 즉 b가 1일때는 a%c를 리턴하고, b/2를 재귀적으로 호출한다. 이때 b/2가 홀수라면, a를 한번 더 곱하여 나머지를 리턴하고, 짝수라면 그냥 나머지를 리턴하면 된다.

✅️[코드]

#include <bits/stdc++.h>

using namespace std;

#define ll long long

ll ans(ll a, ll b, ll c){

    if(b == 1) return a % c;

    ll val = ans(a, b/2, c);

    val = val * val % c;

    if(b%2 == 0) return val;

    return val * a % c;

}

int main() {

    ios::sync_with_stdio(0);

    cin.tie(0);

    

    int a,b,c;

    

    cin >> a >> b >> c;

    

    cout << ans(a,b,c);

}

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ 2630] 색종이 만들기 - C++  (0) 2022.08.09
2583번 영역구하기 - C++  (0) 2022.08.04
7562번 나이트의 이동 - C++  (0) 2022.08.02
5427번 불 - C++  (0) 2022.08.02
1012번 유기농 배추 - C++  (0) 2022.07.31