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