수학2_a^b에대해서 알아보자.
본문 바로가기
알고리즘 최종 (단계별)/1.수학

수학2_a^b에대해서 알아보자.

by KyeongMin 2023. 7. 12.
728x90
반응형

a^b

  • a의 b제곱을 빠르게 구해야함
int ans = 1;
for (int i=1; i<=b; i++){
	ans = ans *a;
}
  • 이렇게 하면 직관적이지만 O(b)라는 시간이 걸림

분할 정복을 이용하는 방법

  • a^2b = a^b * a^b
  • a^(2b+1) = a * a^2b
    • 이렇게 하면됨
int calc (int a, int b){
	if(b==0) reutrn 1;
	else if(b==1) return a;
	else if(b%2==0){
		int temp = clac(a,b/2);
		return temp * temp;
	}
	else return a * clac(a, b-1); //b%2==1;
}
  • 이진수 원리를 이용하는 경우
int calc(int a, int b){
	int ans = 1;
	while(b>0){
		if(b%2==1) ans*=a;
		a = a * a;
		b /=2;
	}
	return ans;
}
  • 이진수의 원리 왜? 이렇게 하지?
    • 예를 들어 3의 27승인 경우
      • 27은 이진수로 11011인데
      • 2^0 + 2^1 + 2^2 + 2^3 + 2^4 인데
      • = 1 + 2 + 8 + 16
      • 즉, 3^27 = 3^(1+2+8+16)
      • 3^1 * 3^2 * 3^8 * 3^16
        • 그렇기 때문에 a를 a*a로 곱해가면서 제곱을 구하게 됨

곱셈

#include<iostream>
using namespace std;

long long calc(long long a, long long b, long long c) {
	if (b == 0) return 1;
	else if (b == 1)return a;
	else if (b % 2 == 0) {
		long long temp = calc(a, b / 2,c);
		return temp * temp %c;
	}
	else if (b % 2 == 1) {
		return a * calc(a, b - 1,c) %c;
	}
}

int main(void) {
	
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	long long A, B, C;
	cin >> A >> B >> C;
	int result = calc(A, B,C);
	cout << result % C << '\\n';
	return 0;
}
  • 이진법을 이용한 방법
728x90
반응형

'알고리즘 최종 (단계별) > 1.수학' 카테고리의 다른 글

소인수분해와 팩토리얼_알고리즘  (0) 2023.07.08
소수 찾기 및 판별_심화  (0) 2023.07.05
소수_알고리즘 기본편  (0) 2023.07.04
진법 변환 - 심화  (0) 2023.06.28
진번 기초 문제  (0) 2023.06.27

댓글