#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