#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; } |
English