#include <bits/stdc++.h> using namespace std; #define st first #define nd second typedef long long int lli; const int MAXN = 200005; const lli MOD = 1000000007; int t[MAXN]; vector<int> v[MAXN]; int lab[MAXN]; lli pot(lli a, int n) { if (n == 0) return 1; if (n % 2 == 0) return pot((a*a)%MOD, n/2); else return (a * pot(a, n-1)) % MOD; } lli rev(lli a) { return pot(a, MOD-2); } lli fact[MAXN]; lli binom(lli n, lli k) { // printf(" binom %lld %lld\n", n, k); return (((fact[n] * rev(fact[k])) % MOD) * rev(fact[n-k])) % MOD; } bool found_conflict; pair<pair<lli, lli>, pair<lli, lli>> sumuj(pair<pair<lli, lli>, pair<lli, lli>> a, pair<pair<lli, lli>, pair<lli, lli>> b) { return {{a.st.st+b.st.st, a.st.nd+b.st.nd}, {a.nd.st+b.nd.st, a.nd.nd+b.nd.nd}}; } // {{n_1, n_2}, {s_n_1, s_n_2}} pair<pair<lli, lli>, pair<lli, lli>> dfs(int x, int l) { lab[x] = l; int tmp[4]; tmp[l] = 1; tmp[3-l] = 0; pair<pair<lli, lli>, pair<lli, lli>> res = {{tmp[1], tmp[2]}, {tmp[1]*t[x], tmp[2]*t[x]}}; for (int a : v[x]) { if (lab[a] == l) { // return {{MAXN, 0}, {0, 0}}; found_conflict = true; } if (lab[a] == 0) res = sumuj(res, dfs(a, 3-l)); } return res; } int main() { int n, m; scanf("%d%d", &n, &m); fact[0] = 1; for (int i=1; i<=n; i++) { fact[i] = (fact[i-1] * i) % MOD; } for (int i=0; i<n; i++) { scanf("%d", &t[i]); } for (int i=0; i<m; i++) { int a, b; scanf("%d%d", &a, &b); a--; b--; v[a].push_back(b); v[b].push_back(a); } lli fin = 1; for (int i=0; i<n; i++) { if (lab[i] == 0) { found_conflict = false; auto r = dfs(i, 1); if (found_conflict) { fin = (fin * pot(2, r.st.st+r.st.nd-1)) % MOD; // printf("full: (%lld %lld), (%lld %lld), %lld\n", r.st.st, r.st.nd, r.nd.st, r.nd.nd, fin); } else { fin = (fin * binom(r.st.st+r.st.nd, r.st.st + r.nd.nd - r.nd.st)) % MOD; // printf("bicol: (%lld %lld), (%lld %lld), %lld\n", r.st.st, r.st.nd, r.nd.st, r.nd.nd, fin); } // printf(" %lld, %d\n", fin, found_conflict); } } printf("%lld\n", fin); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <bits/stdc++.h> using namespace std; #define st first #define nd second typedef long long int lli; const int MAXN = 200005; const lli MOD = 1000000007; int t[MAXN]; vector<int> v[MAXN]; int lab[MAXN]; lli pot(lli a, int n) { if (n == 0) return 1; if (n % 2 == 0) return pot((a*a)%MOD, n/2); else return (a * pot(a, n-1)) % MOD; } lli rev(lli a) { return pot(a, MOD-2); } lli fact[MAXN]; lli binom(lli n, lli k) { // printf(" binom %lld %lld\n", n, k); return (((fact[n] * rev(fact[k])) % MOD) * rev(fact[n-k])) % MOD; } bool found_conflict; pair<pair<lli, lli>, pair<lli, lli>> sumuj(pair<pair<lli, lli>, pair<lli, lli>> a, pair<pair<lli, lli>, pair<lli, lli>> b) { return {{a.st.st+b.st.st, a.st.nd+b.st.nd}, {a.nd.st+b.nd.st, a.nd.nd+b.nd.nd}}; } // {{n_1, n_2}, {s_n_1, s_n_2}} pair<pair<lli, lli>, pair<lli, lli>> dfs(int x, int l) { lab[x] = l; int tmp[4]; tmp[l] = 1; tmp[3-l] = 0; pair<pair<lli, lli>, pair<lli, lli>> res = {{tmp[1], tmp[2]}, {tmp[1]*t[x], tmp[2]*t[x]}}; for (int a : v[x]) { if (lab[a] == l) { // return {{MAXN, 0}, {0, 0}}; found_conflict = true; } if (lab[a] == 0) res = sumuj(res, dfs(a, 3-l)); } return res; } int main() { int n, m; scanf("%d%d", &n, &m); fact[0] = 1; for (int i=1; i<=n; i++) { fact[i] = (fact[i-1] * i) % MOD; } for (int i=0; i<n; i++) { scanf("%d", &t[i]); } for (int i=0; i<m; i++) { int a, b; scanf("%d%d", &a, &b); a--; b--; v[a].push_back(b); v[b].push_back(a); } lli fin = 1; for (int i=0; i<n; i++) { if (lab[i] == 0) { found_conflict = false; auto r = dfs(i, 1); if (found_conflict) { fin = (fin * pot(2, r.st.st+r.st.nd-1)) % MOD; // printf("full: (%lld %lld), (%lld %lld), %lld\n", r.st.st, r.st.nd, r.nd.st, r.nd.nd, fin); } else { fin = (fin * binom(r.st.st+r.st.nd, r.st.st + r.nd.nd - r.nd.st)) % MOD; // printf("bicol: (%lld %lld), (%lld %lld), %lld\n", r.st.st, r.st.nd, r.nd.st, r.nd.nd, fin); } // printf(" %lld, %d\n", fin, found_conflict); } } printf("%lld\n", fin); return 0; } |