Notice
Recent Posts
Recent Comments
:: ADVANCE ::
[수학][제곱] a^n 제곱 본문
반응형
[수학][제곱] a^n 제곱
a의 n제곱 빠르게 구하기
1. 단순 반복문 -> 시간 복잡도 O(n)
1 2 3 4 | int ans = 1; for(int i = 1; i <= n; i++) { ans *= i; } | cs |
2. 분할 정복
1 2 3 4 5 6 7 8 9 10 11 | int times(int a, int n) { int temp; if(n == 0) return 1; if(n == 1) return n; if(n % 2) return a * times(a, n - 1); // n % 2 == 0 temp = times(a, n / 2); return temp * temp; } | cs |
* n이 짝수일 때
return times(a, n / 2) * times(a, n / 2);
를 할 경우 (중복되는) 함수 호출이 2배가 되어 시간복잡도는 O(2^n)이 된다.
3. 이진수 이용하기
>> n의 이진수 중 1에 해당할 때 곱하여 나간다.
1 2 3 4 5 6 7 8 9 10 11 | int times(int a, int n) { int ans = 1; while(n > 0) { if(n % 2) ans *= a; a *= a; n /= 2; } return ans; } | cs |
>> a는 반복문을 돌 때마다 (이진수의 자리수를 옮길 때 마다)
a *= a를 통해서 제곱을 해 준다.
관련 문제
반응형
'Algorithm > math' 카테고리의 다른 글
[BaekJoon][10830] 행렬 제곱 (0) | 2016.05.27 |
---|---|
[수학][Matrix] 행렬 Matrix (0) | 2016.05.27 |
[BaekJoon][2004] 조합 0의 개수 (2) | 2016.05.24 |
[BaekJoon][1676] 팩토리얼 0의 개수 (2) | 2016.05.24 |
[BaekJoon][11635] 소인수분해 (0) | 2016.05.24 |
Comments