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