Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- using ll = long long;
- #define pb emplace_back
- const int maxn = 100010, maxm = 105, mod = 1e9+7;
- int p;
- int tar[maxm], tl, n;
- vector<int> edge[maxn];
- int a[maxn];
- ll res;
- int c[maxn], cl;
- bool check() {
- assert(c[0]);
- __int128 a = 0, b = 0;
- for (int i = 0;i < tl;++i) a = a * p + tar[i];
- for (int i = 0;i < cl;++i) b = b * p + c[i];
- //cerr << "A " << (ll)a << " B " << (ll)b << '\n';
- return b >= a;
- //
- // for (int i = 0;i < tl;++i)
- // cerr << tar[i] << ' ';
- // cerr << '\n';
- // for (int i =0;i < cl;++i)
- // cerr << c[i] << ' ';
- // cerr << '\n';
- if (p < 0 && (~tl&1)) {
- // target is negative
- if (cl&1) return true;
- // Mine is positive
- if (cl < tl) return true;
- // Mine is bigger
- if (cl > tl) return false;
- // Mine is smaller
- for (int i = 0;i < cl;++i)
- if (c[i] != tar[i])
- return (~i&1) ? c[i] > tar[i] : c[i] < tar[i];
- return true;
- }
- else {
- // target is positive
- if (p < 0 && (~cl&1)) return false;
- // Mine negative
- if (cl < tl) return false;
- if (cl > tl) return true;
- for (int i = 0;i < cl;++i)
- if (c[i] != tar[i])
- return (p<0 && (i&1)) ? -c[i] > -tar[i] : c[i] > tar[i];
- return true;
- }
- }
- void dfs(int now) {
- //cerr << "DFS " << now << '\n';
- c[cl++] = a[now];
- int v = check();
- //cerr << (v ? "GOOD " : " BAD" ) << "\n\n";
- res += v;
- for (int u : edge[now])
- dfs(u);
- --cl;
- }
- void solve() {
- for (int i = 0;i < n;++i)
- if (a[i]) dfs(i);
- if (tl == 1 && tar[0] == 0)
- res += count(a, a+n, 0);
- }
- signed main() {
- ios_base::sync_with_stdio(0), cin.tie(0);
- cin >> n >> p >> tl;
- for (int i = 0;i < tl;++i)
- cin >> tar[i];
- for (int i = 0;i < n;++i)
- cin >> a[i];
- int E;
- cin >> E;
- for (int a, b;E--;) {
- cin >> a >> b;
- edge[a].pb(b);
- }
- solve();
- cout << res % mod << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement