2개의 자연수의 최대공약수를 구하는 알고리즘
a를 b로 나눈 나머지를 r이라 하면,
a와 b의 최대공약수는 b와 r의 최대공약수와 같다는 성질 이용
// 재귀
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
// 반복문
int gcd_iter(int a, int b) {
while (b != 0) {
int tmp = b;
b = a % b;
a = tmp;
}
return a;
}
https://www.acmicpc.net/problem/2960
1부터 N까지의 모든 소수를 빠르게 구하는 알고리즘
N 이하의 모든 자연수에서 소수의 배수를 제거하는 방식
vector<bool> isPrime(N, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= N; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= N; j += i)
isPrime[j] = false;
}
}
조합(nCk) : n가지의 물건 중 k 개의 물건을 순서 구분 없이 고르는 경우의 수
nCk = n! / (k! * (n-k)!)
파스칼의 삼각형 성질을 이용하면 DP로 효율적으로 계산 가능
nCk = n-1Ck-1 + n-1Ck
D[n][k] == nCk 이라고 하면
D[n][k] == D[n-1][k-1] + D[n-1][k]