Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #ifdef ENABLE_DEBUG
- #define DEBUG(x) std::cout << x << std::endl
- #else
- #define DEBUG(x)
- #endif
- #define fi first
- #define se second
- #define pb push_back
- #define all(x) x.begin(),x.end()
- #define rall(x) x.rbegin(),x.rend()
- using namespace std;
- using ii = pair<int, int>;
- using i64 = long long;
- const int INF = 0x3f3f3f3f;
- const i64 INFLL = 0x3f3f3f3f3f3f3f3f;
- int n;
- int sz;
- vector<int> g, C;
- vector<int> freq(sz, 0);
- i64 gcd_r = 0;
- int MAXV = 0;
- map<pair<ii, ii>, int> dp;
- int solve(int idx, int value, bool p1, bool p2) {
- if (dp.count({{idx, value}, {p1, p2}})) {
- return dp[{{idx, value}, {p1, p2}}];
- }
- if (idx == sz) {
- // cout << value << ' ' << p1 << ' ' << p2 << '\n';
- return dp[{{idx, value}, {p1, p2}}] = (value == 0 and p1 and p2);
- }
- int ans = 0;
- for (int i = 0; i <= freq[idx]; ++i) {
- int j = freq[idx] - i;
- ans |= solve(idx + 1, value + i * C[idx] - j * C[idx], p1 | (i > 0), p2 | (j > 0));
- }
- return dp[{{idx, value}, {p1, p2}}] = ans;
- }
- int main() {
- cin.tie(0)->sync_with_stdio(0);
- cin >> n;
- g = vector<int>(n);
- for (int i = 0; i < n; ++i) {
- int r;
- cin >> g[i] >> r;
- MAXV += g[i];
- C.pb(g[i]);
- gcd_r = gcd(gcd_r, r);
- }
- if (n == 1) {
- cout << "N\n";
- return 0;
- }
- sort(all(g));
- sort(all(C));
- C.erase(unique(all(C)), C.end());
- sz = C.size();
- freq = vector<int>(sz, 0);
- for (int i = 0; i < n; ++i) {
- int p = (lower_bound(all(C), g[i]) - C.begin());
- ++freq[p];
- }
- for (int i = 0; i <= MAXV; ++i) {
- int ans = solve(0, i, 0, 0);
- // cout << i << ' ' << ans << '\n';
- if (ans and (i % gcd_r == 0)) {
- cout << "Y\n";
- return 0;
- }
- }
- cout << "N\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment