PS
BOJ 17436 : 소수의 배수
lickelon
2024. 5. 5. 22:35
- 문제 링크 : boj.kr/17436
- 난이도 : G3
- 태그 : 조합론
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ll n, m;
cin >> n >> m;
ll ans = 0;
vector<ll> arr(n);
for(auto &u : arr) cin >> u;
for(int i = 1; i < 1 << n; i++) {
ll total = 1;
int cnt = 0;
for(int j = 0; j < n; j++) {
if(i & (1 << j)) {
total *= arr[j];
cnt++;
}
}
ans += (cnt % 2 ? 1 : -1) * (m / total);
}
cout << ans;
return 0;
}
풀이
m을 어떤 수로 나누어 그 수의 배수의 개수를 구할 수 있다.
어떤 수는 주어진 소수를 곱하거나 곱하지 않아 얻을 수 있다.
포함 배제의 원리에 의해 어떤 수에 소수가 홀수번 곱해졌으면 결과에 더해주고, 짝수번 곱해졌으면 결과에 빼준다.
728x90