#include <bits/stdc++.h> using namespace std; typedef long long LL; bool tab[200001]; vector<vector<int>> graf; char kolor[200001]; int odw; vector<int> zlicz(2); pair<int, int> DFS_kol(int u, int par){ if(kolor[u]!=0 && kolor[u]==kolor[par]) return {-1, -1}; if(kolor[u]!=0) return {0, 0}; if(kolor[par]==1) kolor[u]=2; else kolor[u]=1; zlicz[kolor[u]-1]+=tab[u]; odw++; pair<int, int> wyn1={0, 0}; bool flag=false; for(int i=0; i<graf[u].size(); i++){ if(graf[u][i]!=par){ auto x=DFS_kol(graf[u][i], u); if(x.first==-1) flag=true; wyn1.first+=x.first; wyn1.second+=x.second; } } if(flag) return {-1, -1}; if(kolor[u]==1) wyn1.first++; else wyn1.second++; return wyn1; } ///////////// const LL mod=1e9+7; LL silnia[200001]; LL pot_2[200001]; LL inv(LL a) { return a<=1 ? a:mod-(mod/a)*inv(mod%a)%mod; } LL newton(int x, int y){ return (silnia[x]*inv((silnia[y]*silnia[x-y])%mod))%mod; } LL kombi(int parz, int niep, int zap_parz, int zap_niep){ if(parz==-1){ return pot_2[odw-1]; } if(zap_parz<zap_niep){ swap(zap_parz, zap_niep); swap(parz, niep); } zap_parz-=zap_niep; zap_niep=0; LL wyn=0; for(; zap_parz<=parz && zap_niep<=niep;){ wyn+=(newton(parz, zap_parz)*newton(niep, zap_niep))%mod; wyn%=mod; zap_parz++; zap_niep++; } return wyn; } //////////// int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m, a, b; cin>>n>>m; for(int i=1; i<=n; i++){ cin>>tab[i]; } graf.resize(n+1); for(int i=0; i<m; i++){ cin>>a>>b; graf[a].push_back(b); graf[b].push_back(a); } silnia[0]=1; pot_2[0]=1; for(int i=1; i<200001; i++){ silnia[i]=(silnia[i-1]*i)%mod; pot_2[i]=(pot_2[i-1]*2)%mod; } kolor[0]=1; LL wynik_tot=1; for(int i=0; i<n; i++){ if(kolor[i]==0){ zlicz={0, 0}; odw=0; pair<int, int> kol=DFS_kol(i, 0); wynik_tot*=kombi(kol.first, kol.second, zlicz[0], zlicz[1]); wynik_tot%=mod; } } cout<<wynik_tot; 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 | #include <bits/stdc++.h> using namespace std; typedef long long LL; bool tab[200001]; vector<vector<int>> graf; char kolor[200001]; int odw; vector<int> zlicz(2); pair<int, int> DFS_kol(int u, int par){ if(kolor[u]!=0 && kolor[u]==kolor[par]) return {-1, -1}; if(kolor[u]!=0) return {0, 0}; if(kolor[par]==1) kolor[u]=2; else kolor[u]=1; zlicz[kolor[u]-1]+=tab[u]; odw++; pair<int, int> wyn1={0, 0}; bool flag=false; for(int i=0; i<graf[u].size(); i++){ if(graf[u][i]!=par){ auto x=DFS_kol(graf[u][i], u); if(x.first==-1) flag=true; wyn1.first+=x.first; wyn1.second+=x.second; } } if(flag) return {-1, -1}; if(kolor[u]==1) wyn1.first++; else wyn1.second++; return wyn1; } ///////////// const LL mod=1e9+7; LL silnia[200001]; LL pot_2[200001]; LL inv(LL a) { return a<=1 ? a:mod-(mod/a)*inv(mod%a)%mod; } LL newton(int x, int y){ return (silnia[x]*inv((silnia[y]*silnia[x-y])%mod))%mod; } LL kombi(int parz, int niep, int zap_parz, int zap_niep){ if(parz==-1){ return pot_2[odw-1]; } if(zap_parz<zap_niep){ swap(zap_parz, zap_niep); swap(parz, niep); } zap_parz-=zap_niep; zap_niep=0; LL wyn=0; for(; zap_parz<=parz && zap_niep<=niep;){ wyn+=(newton(parz, zap_parz)*newton(niep, zap_niep))%mod; wyn%=mod; zap_parz++; zap_niep++; } return wyn; } //////////// int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m, a, b; cin>>n>>m; for(int i=1; i<=n; i++){ cin>>tab[i]; } graf.resize(n+1); for(int i=0; i<m; i++){ cin>>a>>b; graf[a].push_back(b); graf[b].push_back(a); } silnia[0]=1; pot_2[0]=1; for(int i=1; i<200001; i++){ silnia[i]=(silnia[i-1]*i)%mod; pot_2[i]=(pot_2[i-1]*2)%mod; } kolor[0]=1; LL wynik_tot=1; for(int i=0; i<n; i++){ if(kolor[i]==0){ zlicz={0, 0}; odw=0; pair<int, int> kol=DFS_kol(i, 0); wynik_tot*=kombi(kol.first, kol.second, zlicz[0], zlicz[1]); wynik_tot%=mod; } } cout<<wynik_tot; return 0; } |