1. 程式人生 > 其它 >Codeforces Round #788 (Div. 2) C. Where is the Pizza?

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