Codeforces Round #788 (Div. 2) C. Where is the Pizza?
作者:互联网
假设ci=ai,那么一定有cj=aj(aj= =bi),循环这个过程直到ck=ak(bk= =ai),这个过程中所选出的元素为一个集合(在b中也有一个相同的集合,只是顺序不同),不同集合数量为cnt,答案即为2^(cnt-m)(m为c确定的集合个数)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 1e9+7;
LL qpow(int x,int k){
LL base=x,res=1;
while(k){
if(k&1){
res=res*base%mod;
}
base=base*base%mod;
k>>=1;
}
return res;
}
int find(int x,vector<int> &fa){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x],fa);
}
int main(){
ios::sync_with_stdio(false);
int test,n;
cin>>test;
while(test--){
cin>>n;
vector<int> a(n+1),b(n+1),c(n+1),fa(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++) fa[i]=i;
int cnt=n;
unordered_map<int,int> mii;
for(int i=1;i<=n;i++){
if(a[i]==b[i]){
mii[a[i]]=1;
cnt--;
continue;
}
int u=find(a[i],fa);
int v=find(b[i],fa);
if(u!=v){
cnt--;
fa[u]=v;
}
}
for(int i=1;i<=n;i++){
if(c[i]){
int u=find(c[i],fa);
if(!mii[u]){
cnt--;
mii[u]=1;
}
}
}
cnt=max(cnt,0);
//cout<<"cnt: "<<cnt<<endl;
cout<<qpow(2,cnt)<<endl;
}
return 0;
}
标签:int,res,LL,788,Codeforces,fa,test,Div,mod 来源: https://www.cnblogs.com/xhy666/p/16245795.html