#include <bits/stdc++.h> using namespace std; int n,m; int stan[200100]; vector <int> graf[200100]; int odw[200100]; bool error = 0; vector<int> X, Y; void dfs(int v, int gr){ odw[v] = gr; if(gr==1) X.push_back(v); else Y.push_back(v); for(int i: graf[v]){ if(odw[i] == gr) error = 1; if(odw[i] == 0) dfs(i, -gr); } } const long long P = 1e9 + 7; long long res = 1; long long silnia[200100]; long long odwr(long long x, int n){ if(n==1) return x; long long y = odwr(x, n/2); y = (y*y)%P; if(n % 2 == 0) return y; return (y*x) % P; } long long beczka(int N, int K){ long long wyn = silnia[N]; wyn *= odwr(silnia[K], P-2); wyn %= P; wyn *= odwr(silnia[N-K], P-2); wyn %= P; return wyn; } void update(){ int x1=0, x2=0, y1=0, y2=0; for(int i: X){ if(stan[i]==1)x1++; else x2++; } for(int i: Y){ if(stan[i]==1)y1++; else y2++; } if(y1 > x1){ swap(x1,y1); swap(x2,y2); } int r = x1 - y1; int l = 0; long long ways = 0; while(l+r <= x1+x2 && l <= y1+y2){ long long spos = beczka(x1+x2, l+r) * beczka(y1+y2, l); spos %= P; ways += spos; ways %= P; l++; } res *= ways; res %= P; } int main(){ silnia[0] = 1; for(long long i=1;i<=200010;i++){ silnia[i] = i*silnia[i-1]; silnia[i] %= P; } cin>>n>>m; for(int i=1;i<=n;i++)cin>>stan[i]; for(int i=0;i<m;i++){ int a,b; cin>>a>>b; graf[a].push_back(b); graf[b].push_back(a); } for(int i=1;i<=n;i++){ if(odw[i] == 0){ dfs(i, 1); if(error == true){ int p = X.size() + Y.size() - 1; for(int j = 1; j <= p; j++){ res *= 2; res %= P; } } else { update(); } error = 0; X.clear(); Y.clear(); } } cout<<res; }
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 | #include <bits/stdc++.h> using namespace std; int n,m; int stan[200100]; vector <int> graf[200100]; int odw[200100]; bool error = 0; vector<int> X, Y; void dfs(int v, int gr){ odw[v] = gr; if(gr==1) X.push_back(v); else Y.push_back(v); for(int i: graf[v]){ if(odw[i] == gr) error = 1; if(odw[i] == 0) dfs(i, -gr); } } const long long P = 1e9 + 7; long long res = 1; long long silnia[200100]; long long odwr(long long x, int n){ if(n==1) return x; long long y = odwr(x, n/2); y = (y*y)%P; if(n % 2 == 0) return y; return (y*x) % P; } long long beczka(int N, int K){ long long wyn = silnia[N]; wyn *= odwr(silnia[K], P-2); wyn %= P; wyn *= odwr(silnia[N-K], P-2); wyn %= P; return wyn; } void update(){ int x1=0, x2=0, y1=0, y2=0; for(int i: X){ if(stan[i]==1)x1++; else x2++; } for(int i: Y){ if(stan[i]==1)y1++; else y2++; } if(y1 > x1){ swap(x1,y1); swap(x2,y2); } int r = x1 - y1; int l = 0; long long ways = 0; while(l+r <= x1+x2 && l <= y1+y2){ long long spos = beczka(x1+x2, l+r) * beczka(y1+y2, l); spos %= P; ways += spos; ways %= P; l++; } res *= ways; res %= P; } int main(){ silnia[0] = 1; for(long long i=1;i<=200010;i++){ silnia[i] = i*silnia[i-1]; silnia[i] %= P; } cin>>n>>m; for(int i=1;i<=n;i++)cin>>stan[i]; for(int i=0;i<m;i++){ int a,b; cin>>a>>b; graf[a].push_back(b); graf[b].push_back(a); } for(int i=1;i<=n;i++){ if(odw[i] == 0){ dfs(i, 1); if(error == true){ int p = X.size() + Y.size() - 1; for(int j = 1; j <= p; j++){ res *= 2; res %= P; } } else { update(); } error = 0; X.clear(); Y.clear(); } } cout<<res; } |