ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #788 (Div. 2) C. Where is the Pizza?

2022-05-08 16:03:23  阅读:153  来源: 互联网

标签:int res LL 788 Codeforces fa test Div mod


假设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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有