标签:个数 name 移动 结果 strong png 描述 现在 多少
【问题描述】
YJC 很喜欢玩游戏,今天他决定和朋友们玩密码游戏。 密码游戏的规则是这样的:初始时有两个大小为 m 的数组 a 和 b,分别是 0~m-1 的一 个排列。每一次操作在 0~m-1 之间选一个数 x,求出结果 y=b[a[x]],把 x 和 y 写下来。之 后,a 数组向前循环移动一次,即(a[0],a[1],...,a[m-2],a[m-1])变成(a[1],a[2],...,a[m-1],a[0])。 当 a 数组变回初始状态时,b 数组向前循环移动一次。现在知道所有的 x 和 y,如果 YJC 能 求出任意一组符合条件的 a 和 b 的初值,YJC 就赢了。 YJC 很想赢得游戏,但他太笨了,他想让你帮他算出 a 和 b 的初值。
【输入格式】
第一行包含两个整数 n 和 m,表示操作了多少次和 a、b 数组的大小。 第二行包含 n 个整数,第 i 个数表示第 i 次选出的 x。 第二行包含 n 个整数,第 i 个数表示第 i 次求出的 y。
【输出格式】
第一行包含 m 个整数,表示 a 的初值。 第二行包含 m 个整数,表示 b 的初值。如果有多组答案,输出任意一组即可。
【输入输出样例】
输入
4 2
0 0 0 0
0 1 1 0
输出
0 1
0 1
【数据说明】
对于 30%的数据,满足 m≤5,n≤1000。
对于 100%的数据,满足 2≤m≤26,m2≤n≤100000,保证数据随机,且存在至少一组 a 和 b。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; int a[30],b[30]; bool aa[30],bb[30]; int n,m,cnt,dx,dy; int head[50]; int x[100005],y[100005]; bool key; int re[30][30]; long long read(){ long long a=0,b=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){ ch=getchar(); } if(ch==‘-‘){ b=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘){ a=a*10+ch-‘0‘; ch=getchar(); } return a*b; } void Print_res(){ for (int i=0;i<m;i++){ printf("%d ",a[i]); } printf("\n"); for (int i=0;i<m;i++){ printf("%d ",b[i]); } } void dfs(int t){ if(t==m){ Print_res(); key=1; return; } for(int k=0;k<m;k++){ if(aa[k]){ continue; } a[t]=k; bool ok=1; bool temp[30]={0}; for(int e=0;e<m;e++){ if(re[t][e]==-1){ continue; } int v=(a[t]+e)%m; int val=re[t][e]; if((b[v]==-1&&bb[val]==0)||b[v]==val); else{ ok=0; break; } } if(ok==0){ continue; } aa[k]=1; for (int e=0;e<m;e++){ if(re[t][e]==-1){ continue; } int v=(a[t]+e)%m; int val=re[t][e]; if(b[v]==-1){ b[v]=val; bb[val]=1; temp[v]=1; } } dfs(t+1); if(key){ return; } for (int i=0;i<m;i++){ if (temp[i]){ bb[b[i]]=0; b[i]=-1; } } aa[k]=0; } } int main(){ freopen("password.in","r",stdin); freopen("password.out","w",stdout); n=read(),m=read(); for(int i=1;i<=n;i++){ x[i]=read(); } for(int i=1;i<=n;i++){ y[i]=read(); } for(int i=0;i<m;i++){ a[i]=b[i]=-1; } memset(re,-1,sizeof(re)); while(cnt<n){ cnt++; re[(x[cnt]+dx)%m][dy]=y[cnt]; dx++; if(dx==m){ dx=0,dy++; } if(dy==m){ dy=0; } } dfs(0); return 0; }
标签:个数 name 移动 结果 strong png 描述 现在 多少
原文地址:https://www.cnblogs.com/xiongchongwen/p/11806070.html