列表

详情


NC221801. 个性

描述

众所周知,人的个性是要变的,牛妹为了检验牛牛的忠心,特意出了一道题。

人的交际圈可以看做一个有n个结点,m条没有重边的无向图。每个结点都是一个人,编号分别为1,2,3,...,n-1,n,两点之间有边代表这两个人“关系不错”。
每一个人最开始都会有一个初始个性值,每个人的个性会随着时间的迁移而改变。在每个单位的时间里,每个人的个性值会异或上这个人“关系不错”的所有人的个性值的异或和(即相连的结点的值的异或和)。
自从这个圈子形成已经有t个单位的时间了,牛妹知道现在每个人的个性值,编号为i的人的个性值为a_i,牛妹想知道最初(即0个单位时间)人的个性值为多少,只需要得出一种符合条件的情况即可。

输入描述

第一行输入三个正整数n,m,t表示图有n个结点,m条边,经过了p个单位时间。
第二行输入n个整数,a_1,a_2,a_3...a_n,表示每个人当前的个性值。
第三行到第m+2行每行输入两个整数u_i,v_i,表示u_iv_i之间有一条边。

输出描述

一行,n个整数,表示每个人最初的个性值,中间用逗号隔开。只需要输出一种符合条件的情况即可。

示例1

输入:

5 6 1
2 2 5 6 5
1 2
2 3
1 5
1 4
3 5
4 5

输出:

5 4 3 1 2

说明:

样例答案不唯一。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 11ms, 内存消耗: 508K, 提交时间: 2021-05-24 23:53:49

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#define MN 60

int n,m,t,b[MN+5],x[MN+5];

int bb[MN+5];

struct Matrix{
	int a[MN][MN];
	Matrix(int x=0){
		memset(a,0,sizeof(a));
		for(int i=0;i<n;i++)
			a[i][i] = x;
	}
	Matrix operator * (const Matrix& that)const{
		Matrix ret;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				for(int k=0;k<n;k++){
					ret.a[i][j] ^= this->a[i][k]&that.a[k][j];
				}
			}
		}
		return ret;
	}
	Matrix operator *= (const Matrix& that){
		return *this = *this*that;
	}
};

Matrix bsc;

Matrix qpow(Matrix bsc,int y){
	Matrix ret = 1;
	while(y){
		if(y&1) ret *= bsc;
		bsc *= bsc;
		y >>= 1;
	}
	return ret;
}

void gauss(Matrix bsc){
	#define a bsc.a
	for(int i=0,s=0;i<n;i++){
		if(a[s][i]==0){
			for(int j=s+1;j<n;j++){
				if(a[j][i]==1){
					for(int k=0;k<n;k++)
						std::swap(a[s][k],a[j][k]);
					std::swap(b[s],b[j]);
					break;
				}
			}
		}
		if(a[s][i]==0) continue;
		for(int j=s+1;j<n;j++){
			if(a[j][i]==1){
				for(int k=0;k<n;k++){
					a[j][k] ^= a[s][k];
				}
				b[j] ^= b[s];
			}
		}
		s++;
	}
	for(int i=n-1;i>=0;i--){
		for(int j=0;j<n;j++){
			if(a[i][j]==1){
				for(int k=j+1;k<n;k++)
					if(a[i][k]==1){
						b[i] ^= x[k];
						a[i][k] = 0;
					}
				x[j] = b[i];
				break;
			}
		}
	}
	#undef a
}

int main(){
	scanf("%d%d%d",&n,&m,&t);
	for(int i=0;i<n;i++){
		scanf("%d",&b[i]);
		bb[i] = b[i];
	}
	for(int i=0;i<m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		--u,--v;
		bsc.a[u][v] = bsc.a[v][u] = 1;
	}
	for(int i=0;i<n;i++)
		bsc.a[i][i] = 1;
	bsc = qpow(bsc,t);
	gauss(bsc);
	for(int i=0;i<n;i++){
		int ans = 0;
		for(int j=0;j<n;j++){
			if(bsc.a[i][j]) ans ^= x[j];
		}
		if(ans!=bb[i]){
			printf("Error on node %d : expect %d, get %d\n",i,bb[i],ans);
			exit(1);
		}
	}
	for(int i=0;i<n;i++)
		printf("%d%c",x[i]," \n"[i==n-1]);
}

上一题