//泥の分際で私だけの大切を奪おうだなん #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; } |