[백준]1629번 곱셈 c/c++

2022. 8. 25. 15:17·Algorithm/백준 & 프로그래머스
728x90
728x90

baaaaarking dog님 알고리즘 강의를 참고한 내용입니당

문제

https://www.acmicpc.net/problem/1629

1629번: 곱셈

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

www.acmicpc.net

설명


재귀 문제를 풀때 절차지향적 사고로 풀기보단 귀납적 사고로 푸는것이 좋다.
(절차지향적 사고로 생각하려다가 머리속이 꼬일 수 있기때문에)

그럼 귀납적 방법이란게 뭐냐??

1번 도미노가 쓰러진다
k번 도미노가 쓰러지면 k+1번 도미노도 쓰러진다.

이 문제는 b가 최대 21억 가까이 되기때문에 시간초과가 발생할 것이다.

이 사진의 로직을 이용하면

1승을 계산할 수 있다.
k승을 계산했으면 2k승과 2k+1승도 O(1)에 계산할 수 있다.

코드

#include<iostream>
using namespace std;
using ll = long long;

ll POW(ll a, ll b, ll m)
{
	if (b == 1)
		return a % m;  //base condition
	ll val = POW(a, b / 2, m);
	val = val * val % m; 
	if (b % 2 == 0)
		return val;
	return val * a % m;
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	ll a, b, c;

	cin >> a >> b >> c;

	cout << POW(a, b, c);
}



9번째 줄에 POW(a, b / 2, m)를 즉 a^(b/2) mod m을 val에 저장해주었다.
그리고 val을 제곱해주었다.
만약 b가 7이라고 한다면 b/2는 3이니 10번 줄이 끝났을 때 val은 a^6 mod m의 값이 들어갈 것이다.
즉 b가 짝수이면 그냥 val의 값을 반환하면 끝이지만 b가 홀수이면 val에 a를 한 번 더 곱해서 반환해야 한다.


즉 base condition을 잘 잡아뒀고 k승의 결과를 토대로 2k, 2k+1승의 결과를 계산할 수 있으니
마치 도미노를 쓰러트리는 것 처럼 모든 결과가 잘 계산될 것이다로 함수를 이해할 수 있어야한다!!!!

이 함수의 시간복잡도는 b가 절반씩 계속 깎이기 때문에 O(log b)이다.

728x90
728x90

'Algorithm > 백준 & 프로그래머스' 카테고리의 다른 글

[프로그래머스] 소수 찾기- level1  (0) 2023.03.08
[백준]15649번 N과 M(1) c/c++  (1) 2022.08.26
[백준]1431번 시리얼 번호 (sort 함수 응용)  (0) 2022.08.16
[백준]1463번 1로 만들기 c/c++  (1) 2022.08.04
[백준]2217번 로프 c/c++  (3) 2022.08.02
'Algorithm/백준 & 프로그래머스' 카테고리의 다른 글
  • [프로그래머스] 소수 찾기- level1
  • [백준]15649번 N과 M(1) c/c++
  • [백준]1431번 시리얼 번호 (sort 함수 응용)
  • [백준]1463번 1로 만들기 c/c++
성장하고픈개발자
성장하고픈개발자
방학 기념 개발블로그 작성하기
    반응형
  • 성장하고픈개발자
    꾸준히하자아자
    성장하고픈개발자
  • 전체
    오늘
    어제
    • 분류 전체보기 (65)
      • 프로젝트 (5)
        • 카카오 쇼핑하기 web (4)
        • 요약쏙 (0)
      • Algorithm (46)
        • 백준 & 프로그래머스 (40)
        • 알고리즘 (5)
      • Web (5)
        • 네트워크 (1)
        • Spring (4)
        • JPA (0)
        • HTTP (1)
      • 후기 (3)
      • SSAFY 일상 (6)
      • 취준 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 깃허브
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    web
    싸피
    쉬운딥러닝
    정렬
    그리디
    testing
    Andrew Ng
    싸피 13기
    DP
    네이버데이터센터각
    SSAFY
    C++
    신경망기초
    합격수기
    일상
    스택
    책리뷰
    SpringBoot
    코딩
    백엔드
    알고리즘
    BOJ
    Spring
    회고
    withmockuser
    딥러닝
    백준
    PS
    Spring Data JPA
    FNN
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.1
성장하고픈개발자
[백준]1629번 곱셈 c/c++
상단으로

티스토리툴바