Algorithm (알고리즘)
Algorithm in A..Z - Inclusion–exclusion principle (포함 배제의 원리)
강태종
2021. 3. 5. 19:29
개념
유한 집합의 합집합의 원소의 개수를 세는 기법이다.
작동원리
즉 겹치는 부분이 홀수면 더하고, 겹치는 부분이 짝수이면 뺀다.
시간복잡도
집합의 갯수가 N일 때
O(2^N)
문제
17436번: 소수의 배수
첫째 줄에 N(1 ≤ N ≤ 10)과 M(1 ≤ M ≤ 1012)이 주어진다. 둘째 줄에는 N개의 소수가 주어진다. 입력으로 주어지는 소수는 100보다 작거나 같으며, 같은 소수가 두 번 이상 주어지지 않는다.
www.acmicpc.net
코드
#include <bits/stdc++.h>
using namespace std;
using Int = int;
using Long = long long;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
Int n;
Long m;
cin >> n >> m;
vector<Int> ve(n);
for (auto &i : ve) {
cin >> i;
}
Long ans = 0;
for (Int bit = 1;bit < (1 << n);++bit) {
Int count = 0;
Long value = 1L;
for (Int p = 0;p < n;++p) {
if (bit & (1 << p)) {
count++;
value *= ve[p];
}
}
if (count % 2) {
ans += m / value;
} else {
ans -= m / value;
}
}
cout << ans << "\n";
}