#include <iostream>
#include <vector>
using namespace std;
const long long mod=1'000'000'007;
vector<long long> tab[500'007];
long long byo[500'007];
long long zap[500'007];
long long parz[500'007];
long long silnia[500'007];
long long jed, dwa, cykl, zmia;
void dfs(long long v, long long h)
{
if(byo[v]!=0 && byo[v]!=h)
cykl=1;
if(byo[v]!=0)
return;
byo[v]=h;
//cout<<v<<" "<<h<<"\n";
if(h==1)
jed++;
if(h==2)
dwa++;
if(h==1 && zap[v]==1)
zmia++;
if(h==2 && zap[v]==1)
zmia--;
for(int a=0; a<tab[v].size(); a++)
dfs(tab[v][a], h%2+1);
}
long long pot(long long a, long long p)
{
if(p==1)
return a;
long long wyk=pot(a, p/2);
if(p%2==0)
return (wyk*wyk)%mod;
return ( ((wyk*wyk)%mod) *a)%mod;
}
long long odw(long long i)
{
return pot(i%mod, mod-2);
}
long long becz(long long n, long long k)
{
return (silnia[n]*odw(silnia[k]*silnia[n-k]))%mod;
}
int main()
{
long long n, p, p2, odp=1, m, pom;
cin>>n>>m;
silnia[0]=1;
for(long long a=1; a<=n+5; a++)
silnia[a]=(silnia[a-1]*a)%mod;
for(int a=1; a<=n; a++)
cin>>zap[a];
for(int a=0; a<m; a++)
{
cin>>p>>p2;
tab[p].push_back(p2);
tab[p2].push_back(p);
}
for(int a=1; a<=n; a++)
{
jed=0;dwa=0;cykl=0;zmia=0;pom=0;
if(byo[a]==0 && tab[a].size()>0)
{
dfs(a,1);
//cout<<"cykl "<<cykl<<" jed "<<jed<<" dwa "<<dwa<<" zmia "<<zmia<<"\n";
if(cykl==1)
pom=(pom+pot(2, jed+dwa-1))%mod;
else
{
if(zmia<0)
zmia=zmia*-1;
else
swap(jed,dwa);
for(long long i=0; i+zmia<=dwa && i<=jed; i++)
pom=(pom+ (becz(dwa,i+zmia)*becz(jed,i))%mod )%mod;
}
odp=(odp*pom)%mod;
//cout<<odp<<"\n";
}
}
cout<<odp<<"\n";
}
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 | #include <iostream> #include <vector> using namespace std; const long long mod=1'000'000'007; vector<long long> tab[500'007]; long long byo[500'007]; long long zap[500'007]; long long parz[500'007]; long long silnia[500'007]; long long jed, dwa, cykl, zmia; void dfs(long long v, long long h) { if(byo[v]!=0 && byo[v]!=h) cykl=1; if(byo[v]!=0) return; byo[v]=h; //cout<<v<<" "<<h<<"\n"; if(h==1) jed++; if(h==2) dwa++; if(h==1 && zap[v]==1) zmia++; if(h==2 && zap[v]==1) zmia--; for(int a=0; a<tab[v].size(); a++) dfs(tab[v][a], h%2+1); } long long pot(long long a, long long p) { if(p==1) return a; long long wyk=pot(a, p/2); if(p%2==0) return (wyk*wyk)%mod; return ( ((wyk*wyk)%mod) *a)%mod; } long long odw(long long i) { return pot(i%mod, mod-2); } long long becz(long long n, long long k) { return (silnia[n]*odw(silnia[k]*silnia[n-k]))%mod; } int main() { long long n, p, p2, odp=1, m, pom; cin>>n>>m; silnia[0]=1; for(long long a=1; a<=n+5; a++) silnia[a]=(silnia[a-1]*a)%mod; for(int a=1; a<=n; a++) cin>>zap[a]; for(int a=0; a<m; a++) { cin>>p>>p2; tab[p].push_back(p2); tab[p2].push_back(p); } for(int a=1; a<=n; a++) { jed=0;dwa=0;cykl=0;zmia=0;pom=0; if(byo[a]==0 && tab[a].size()>0) { dfs(a,1); //cout<<"cykl "<<cykl<<" jed "<<jed<<" dwa "<<dwa<<" zmia "<<zmia<<"\n"; if(cykl==1) pom=(pom+pot(2, jed+dwa-1))%mod; else { if(zmia<0) zmia=zmia*-1; else swap(jed,dwa); for(long long i=0; i+zmia<=dwa && i<=jed; i++) pom=(pom+ (becz(dwa,i+zmia)*becz(jed,i))%mod )%mod; } odp=(odp*pom)%mod; //cout<<odp<<"\n"; } } cout<<odp<<"\n"; } |
English