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을 어떤 수로 나누어 그 수의 배수의 개수를 구할 수 있다.

어떤 수는 주어진 소수를 곱하거나 곱하지 않아 얻을 수 있다.

포함 배제의 원리에 의해 어떤 수에 소수가 홀수번 곱해졌으면 결과에 더해주고, 짝수번 곱해졌으면 결과에 빼준다.

'PS' 카테고리의 다른 글

BOJ 5625 : 페스트리  (0) 2024.05.07
BOJ 13424 : 비밀 모임  (0) 2024.05.06
BOJ 2064 : IP 주소  (0) 2024.05.04
BOJ 6593 : 상범 빌딩  (0) 2024.05.03
BOJ 2170 : 선 긋기  (0) 2024.05.02