#include<bits/stdc++.h> #define MAXN 2000005 usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int a[1005][1005]; intmain(){ int h=read(),w=read(); memset(a,-1,sizeof(a)); for (registerint i=1;i<=h;++i){ int len=read(); for (registerint j=1;j<=len;++j){ if (a[i][j]==0){//出现冲突 puts("0"); return0; } a[i][j]=1; } if (a[i][len+1]==1){ puts("0"); return0; } a[i][len+1]=0; } for (registerint i=1;i<=w;++i){ int len=read(); for (registerint j=1;j<=len;++j){ if (a[j][i]==0){ puts("0"); return0; } a[j][i]=1; } if (a[len+1][i]==1){ puts("0"); return0; } a[len+1][i]=0; } longlong ans=1; for (registerint i=1;i<=h;++i){ for (registerint j=1;j<=w;++j){ if (a[i][j]==-1) ans=(ans*2ll)%((longlong)1e9+7);//没被染色 } } printf("%lld\n",ans); }
#include<bits/stdc++.h> #define MAXN 200005 #define int long long #define MOD 1000000007 usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int ans=1; inlineintksm(int b,int p,int k){ int ans=1; while (p>0){ if (p&1ll){ ans=(b*ans)%k; } b=(b*b)%k; p>>=1ll; } return ans%MOD; } inlineintCalc(int x,int n){ while (n){ ans=(ans*ksm(x,n/x,MOD))%MOD; n/=x; } return0; } int cnt,primes[MAXN]; inlinevoidSieve(int x){ int bd=sqrt(x); for (registerint i=2;i<=bd;++i){ if (x%i==0){ primes[++cnt]=i; while (x%i==0) x/=i; } } if (x>1) primes[++cnt]=x;//x是质数 } #undef int intmain(){ #define int long long int x,n; cin>>x>>n; Sieve(x);//找出x的所有质因子 for (registerint i=1;i<=cnt;++i){ Calc(primes[i],n); } cout<<ans; }
bool flag=true; for (registerint i=1;i<=n;++i){ if (!vis[i]){ ans[i]=1; } elseif (vis[i]&&flag){ for (registerint j=0;j<G[i].size();++j){//这次到达的是1,3组 int v=G[i][j]; if (vis[v]) ans[v]=3; } flag=false; } }
int cnt1=0,cnt2=0,cnt3=0; for (registerint i=1;i<=n;++i){ if (ans[i]==0) ans[i]=2; if (ans[i]==1) cnt1++; if (ans[i]==2) cnt2++; if (ans[i]==3) cnt3++; } if (cnt1==0||cnt2==0||cnt3==0) returnputs("-1"),0; if (cnt1*cnt2+cnt2*cnt3+cnt3*cnt1!=m) returnputs("-1"),0;
int c[4]; for (registerint i=1;i<=n;++i){ memset(c,0,sizeof(c)); for (registerint j=0;j<G[i].size();++j){ c[ans[G[i][j]]]++; } if (c[ans[i]]!=0) returnputs("-1"),0;//两个点在同一个集合 if (ans[i]==1) if (c[2]!=cnt2||c[3]!=cnt3) returnputs("-1"),0;//和不相等 if (ans[i]==2) if (c[1]!=cnt1||c[3]!=cnt3) returnputs("-1"),0; if (ans[i]==3) if (c[1]!=cnt1||c[2]!=cnt2) returnputs("-1"),0; }
#include<bits/stdc++.h> #define MAXN 300005 usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int deg[MAXN],vis[MAXN]; int vised[MAXN]; vector<int>G[MAXN]; inlinevoiddfs(int u){ vised[u]=true; for (registerint i=0;i<G[u].size();++i){ if (!vised[G[u][i]]) dfs(G[u][i]); } } int ans[MAXN]; intmain(){ int n=read(),m=read(); for (registerint i=1;i<=m;++i){ int u=read(),v=read(); G[u].push_back(v),G[v].push_back(u); deg[u]++,deg[v]++; } dfs(1); for (registerint i=1;i<=n;++i){ if (!vised[i]) returnputs("-1"),0;//判断联通 } for (registerint i=0;i<G[1].size();++i){ vis[G[1][i]]=true;//标记2,3组 } bool flag=true; for (registerint i=1;i<=n;++i){ if (!vis[i]){ ans[i]=1; } elseif (vis[i]&&flag){ for (registerint j=0;j<G[i].size();++j){//这次到达的是1,3组 int v=G[i][j]; if (vis[v]) ans[v]=3; } flag=false; } } int cnt1=0,cnt2=0,cnt3=0; for (registerint i=1;i<=n;++i){ if (ans[i]==0) ans[i]=2; if (ans[i]==1) cnt1++; if (ans[i]==2) cnt2++; if (ans[i]==3) cnt3++; } if (cnt1==0||cnt2==0||cnt3==0) returnputs("-1"),0; if (cnt1*cnt2+cnt2*cnt3+cnt3*cnt1!=m) returnputs("-1"),0; int c[4]; for (registerint i=1;i<=n;++i){ memset(c,0,sizeof(c)); for (registerint j=0;j<G[i].size();++j){ c[ans[G[i][j]]]++; } if (c[ans[i]]!=0) returnputs("-1"),0; if (ans[i]==1) if (c[2]!=cnt2||c[3]!=cnt3) returnputs("-1"),0; if (ans[i]==2) if (c[1]!=cnt1||c[3]!=cnt3) returnputs("-1"),0; if (ans[i]==3) if (c[1]!=cnt1||c[2]!=cnt2) returnputs("-1"),0; } for (registerint i=1;i<=n;++i){ printf("%d ",ans[i]); } }