Codeforces Round #507 (Div. 1)C. Network Safety

题意:给个n个点 m条边的图  每个点有个权值c 范围(0,2^k-1) 如果边的两个定点的权值不同 那么他们的连接就是安全的   现在有一个病毒  他的值x 在上述范围内随机   存在一个集合 ,int>前面 是点集 后面病毒值x  如果 x感染了 前面的点集的所有点后  (攻击就是  c=c^x)原来的连接仍然是安全的  就是合法的  让你求有多少个合法的集合

思路 :攻击后连接不安全的 条件是 a^x==b^x 则有 a^b==x  符合这个条件的a b要么同时在点集内 要么同时不在  可以把每条边的a^b算出来    x相同的边要么同时在一个集合要么同时不在  以此为依据就能用组合数学的思想算出答案

其中pow的使用要尤为注意  需要自己写一个Pow每次结果%MOD才不会溢出

 

参考了:https://www.cnblogs.com/DeaphetS/p/9599587.html 的文章

下面引用自上述文章

Codeforces Round #507 (Div. 1)C. Network Safety_第1张图片

#include
using namespace std;
typedef long long ll;
const ll MOD=(1e9)+7;
ll liantong;
ll n,m,k;
struct Node{
	ll u,v,x;
}a[500000+10];
ll fa[500000+10];
ll c[500000+10];
sets;
bool cmp(Node a,Node b){
	return a.x

 

你可能感兴趣的:(ACM,union_find,sets,math)