문제링크
https://www.acmicpc.net/problem/1441
1441번: 나누어 질까
첫째 줄에 A의 크기 N과 L, R이 주어진다. N은 18보다 작거나 같은 자연수이고, L은 1,000,000,000보다 작거나 같은 자연수, R은 L보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. 둘째 줄에 A
www.acmicpc.net
풀이
f(x) 를 x 이하의 a 원소들로 나누어지는 자연수의 수 라고 하자
답은 f(r) - f(l - 1) 이 되겠다
f(x) 는 포함배제의 원리로
+ {원소 하나로 나누어지는 경우의 수} - {원소 두개로 모두 나누어지는 경우의 수} ...
이므로 고려한 수 가 홀수면 + 짝수면 - 를 곱해준다
시간복잡도는
$O(2^N + Nlog(1e9))$ 정도가 되겠다
( 원소 선택 경우의수 + euclidean algorithm )
코드
#include <bits/stdc++.h> using namespace std; #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define ll long long #define ld long double typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<pair<int, int> > vpi; typedef vector<vector<int>> vvi; typedef pair<ll, ll> pll; typedef tuple<ll, ll, ll> tlll; typedef vector<ll> vl; typedef vector<pair<ll, ll>> vpl; typedef vector<vector<ll>> vvl; typedef vector<string> vs; int dr[4] = {0, 0, 1, -1}; int dc[4] = {1, -1, 0, 0}; // loops #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define F0R(i, a) FOR(i, 0, a) #define ROF(i, a, b) for (int i = (b)-1; i >= (a); --i) #define R0F(i, a) ROF(i, 0, a) #define rep(a) F0R(_, a) #define each(a, x) for (auto &a : x) int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); #if !defined(ONLINE_JUDGE) freopen("../input.txt", "r", stdin); freopen("../output.txt", "w", stdout); #endif // ONLINE_JUDGE ll n, l, r; cin >> n >> l >> r; vl v(n); each(e, v) cin >> e; ll ansR = 0; ll ansL = 0; function<void(int, ll, int)> f = [&] (int cur, ll tmp, int cnt) { if (tmp > r) return; if (cur == n) { if (cnt > 0) { ll flag = (cnt % 2 ? 1 : -1); ansR += flag * (r / tmp); ansL += flag * ((l - 1) / tmp); } return; } f(cur + 1, tmp, cnt); f(cur + 1, tmp / gcd(tmp, v[cur]) * v[cur], cnt + 1); }; f(0, 1, 0); cout << ansR - ansL; }
728x90
'PS > BOJ' 카테고리의 다른 글
백준 25317번: functionx (C++) (0) | 2023.06.22 |
---|---|
백준 25315번: N수매화검법 (C++) (0) | 2023.06.16 |
백준 16933번: 벽 부수고 이동하기 3 (C++) (1) | 2023.06.11 |
백준 2186번: 문자판 (0) | 2023.06.10 |
백준 1082번: 방 번호 (0) | 2023.06.10 |