#include<bits/stdc++.h> using namespace std; vector<int>graf[200010]; int zlicz[2], zlicz1[2]; int arr[200010]; bool flaga; bool odw[200010]; bool col[200010]; int spojna; void dfs2(int x, int dep){ zlicz[dep]+=arr[x]; zlicz1[dep]++; odw[x] = 1; col[x] = dep; spojna++; for(auto j: graf[x]){ if(!odw[j]){ dfs2(j, dep^1); } else if(col[x]==col[j])flaga = 1; } } const long long mod = 1000000007; long long silnie[200010]; long long qp(long long a, long long b){ if(!b)return 1; if(b%2)return a*qp(a, b-1)%mod; auto c = qp(a, b/2); return c*c%mod; } long long f(long long n, long long k){ return silnie[n]*qp(silnie[k], mod-2)%mod*qp(silnie[n-k], mod-2)%mod; } int main() { silnie[0] = 1; for(int i=1;i<=200000;i++) silnie[i] = (silnie[i-1]*i)%mod; int n, m, i; scanf("%d%d", &n, &m); vector<bool>pom; for(i=0;i<n;i++){ int a; scanf("%d", &a); pom.push_back(a); arr[i+1] = a; } while(m--){ int a, b; scanf("%d%d", &a, &b); graf[a].push_back(b); graf[b].push_back(a); } long long wynik=1; for(i=1;i<=n;i++) if(!odw[i]) { zlicz[0] = 0, zlicz[1] = 0, zlicz1[0] = 0, zlicz1[1] = 0, flaga = 0, spojna = 0; dfs2(i, 0); long long wynik2 = 0; if(flaga==0){ while(min(zlicz[0], zlicz[1])>0){ zlicz[0]--; zlicz[1]--; } while(zlicz[0]<=zlicz1[0] && zlicz[1]<=zlicz1[1]){ wynik2 = (wynik2+f(zlicz1[0], zlicz[0])*f(zlicz1[1], zlicz[1]))%mod; zlicz[0]++; zlicz[1]++; } } else wynik2 = qp(2, spojna-1); wynik = (wynik*wynik2)%mod; } printf("%lld\n", wynik); }
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 | #include<bits/stdc++.h> using namespace std; vector<int>graf[200010]; int zlicz[2], zlicz1[2]; int arr[200010]; bool flaga; bool odw[200010]; bool col[200010]; int spojna; void dfs2(int x, int dep){ zlicz[dep]+=arr[x]; zlicz1[dep]++; odw[x] = 1; col[x] = dep; spojna++; for(auto j: graf[x]){ if(!odw[j]){ dfs2(j, dep^1); } else if(col[x]==col[j])flaga = 1; } } const long long mod = 1000000007; long long silnie[200010]; long long qp(long long a, long long b){ if(!b)return 1; if(b%2)return a*qp(a, b-1)%mod; auto c = qp(a, b/2); return c*c%mod; } long long f(long long n, long long k){ return silnie[n]*qp(silnie[k], mod-2)%mod*qp(silnie[n-k], mod-2)%mod; } int main() { silnie[0] = 1; for(int i=1;i<=200000;i++) silnie[i] = (silnie[i-1]*i)%mod; int n, m, i; scanf("%d%d", &n, &m); vector<bool>pom; for(i=0;i<n;i++){ int a; scanf("%d", &a); pom.push_back(a); arr[i+1] = a; } while(m--){ int a, b; scanf("%d%d", &a, &b); graf[a].push_back(b); graf[b].push_back(a); } long long wynik=1; for(i=1;i<=n;i++) if(!odw[i]) { zlicz[0] = 0, zlicz[1] = 0, zlicz1[0] = 0, zlicz1[1] = 0, flaga = 0, spojna = 0; dfs2(i, 0); long long wynik2 = 0; if(flaga==0){ while(min(zlicz[0], zlicz[1])>0){ zlicz[0]--; zlicz[1]--; } while(zlicz[0]<=zlicz1[0] && zlicz[1]<=zlicz1[1]){ wynik2 = (wynik2+f(zlicz1[0], zlicz[0])*f(zlicz1[1], zlicz[1]))%mod; zlicz[0]++; zlicz[1]++; } } else wynik2 = qp(2, spojna-1); wynik = (wynik*wynik2)%mod; } printf("%lld\n", wynik); } |