//泥の分際で私だけの大切を奪おうだなん
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
const int p=1e9+7;
int qp(int x,int y)
{
int res=1;
for(int t=x; y; y>>=1,t=1ll*t*t%p)
if(y&1) res=1ll*res*t%p;
return res;
}
int a[200003],pw[200003];
int fac[200003],ifac[200003];
vector<int> e[400003];
inline int C(int n,int m){return 1ll*fac[n]*ifac[m]%p*ifac[n-m]%p;;}
int c[2][2];
int col[200003],flg;
void dfs(int x)
{
if(a[x]) ++c[col[x]][0];
++c[col[x]][1];
for(int y:e[x])
if(col[y]==-1) col[y]=col[x]^1,dfs(y);
else flg|=(col[x]==col[y]);
}
signed main()
{
int n=read(),m=read(),ans=1;
fac[0]=ifac[0]=pw[0]=1;
for(int i=1; i<=n; ++i) a[i]=read();
for(int i=1; i<=n; ++i)
pw[i]=(pw[i-1]<<1)%p,
fac[i]=1ll*fac[i-1]*i%p,
ifac[i]=qp(fac[i],p-2);
for(int i=1,u,v; i<=m; ++i)
u=read(),v=read(),
e[u].push_back(v),
e[v].push_back(u);
memset(col,-1,sizeof(col));
for(int i=1; i<=n; ++i) if(col[i]==-1)
{
flg=col[i]=c[0][0]=c[0][1]=c[1][0]=c[1][1]=0,dfs(i);
if(flg) ans=1ll*ans*pw[c[0][1]+c[1][1]-1]%p;
else
{
int mn=min(c[0][0],c[1][0]),sum=0;
c[0][0]-=mn,c[1][0]-=mn;
while(c[0][0]<=c[0][1]&&c[1][0]<=c[1][1])
sum=(sum+1ll*C(c[0][1],c[0][0])*C(c[1][1],c[1][0]))%p,
++c[0][0],++c[1][0];
ans=1ll*ans*sum%p;
}
}
printf("%d\n",ans);
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 | //泥の分際で私だけの大切を奪おうだなん #include<bits/stdc++.h> using namespace std; inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } const int p=1e9+7; int qp(int x,int y) { int res=1; for(int t=x; y; y>>=1,t=1ll*t*t%p) if(y&1) res=1ll*res*t%p; return res; } int a[200003],pw[200003]; int fac[200003],ifac[200003]; vector<int> e[400003]; inline int C(int n,int m){return 1ll*fac[n]*ifac[m]%p*ifac[n-m]%p;;} int c[2][2]; int col[200003],flg; void dfs(int x) { if(a[x]) ++c[col[x]][0]; ++c[col[x]][1]; for(int y:e[x]) if(col[y]==-1) col[y]=col[x]^1,dfs(y); else flg|=(col[x]==col[y]); } signed main() { int n=read(),m=read(),ans=1; fac[0]=ifac[0]=pw[0]=1; for(int i=1; i<=n; ++i) a[i]=read(); for(int i=1; i<=n; ++i) pw[i]=(pw[i-1]<<1)%p, fac[i]=1ll*fac[i-1]*i%p, ifac[i]=qp(fac[i],p-2); for(int i=1,u,v; i<=m; ++i) u=read(),v=read(), e[u].push_back(v), e[v].push_back(u); memset(col,-1,sizeof(col)); for(int i=1; i<=n; ++i) if(col[i]==-1) { flg=col[i]=c[0][0]=c[0][1]=c[1][0]=c[1][1]=0,dfs(i); if(flg) ans=1ll*ans*pw[c[0][1]+c[1][1]-1]%p; else { int mn=min(c[0][0],c[1][0]),sum=0; c[0][0]-=mn,c[1][0]-=mn; while(c[0][0]<=c[0][1]&&c[1][0]<=c[1][1]) sum=(sum+1ll*C(c[0][1],c[0][0])*C(c[1][1],c[1][0]))%p, ++c[0][0],++c[1][0]; ans=1ll*ans*sum%p; } } printf("%d\n",ans); return 0; } |
English