EOJ-2941 在线投票系统

http://acm.cs.ecnu.edu.cn/problem.php?problemid=2941

如题意进行加密操作,求出加密前的数字。

已知: a^b=b^a , a^b^b=a

以n=2为例,则a=a^g[0][0]^g[0][1]^g[1][0]^g[1][1]

设加密前的数字为x1,x2,x3,x4,已知加密后的为y1,y2,y3,y4

则y1=x1^g[0][0]^g[0][1]^g[1][0]^g[1][1] ;

   y2=x2^g[0][0]^g[0][1]^g[1][0]^g[1][1] ;

 …………

所以若想求出xi 只要式子两边同时异或g[0][0]^g[0][1]^g[1][0]^g[1][1]就得到答案 (因为a^b^b=a)

所以方法就是:将所有数异或在一起得到一个值,再分别与这几个个数异或就得到加密前的答案。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<string>
 8 #include<cctype>
 9 using namespace std;
10 int main(){
11     int t;
12     cin>>t;     
13     while(t--){
14         int n,a[25];
15         cin>>n;
16         for(int i=0;i<2*n;i++)
17             cin>>a[i];
18         int temp=a[0];
19         for(int i=1;i<2*n;i++)
20             temp^=a[i];
21         for(int i=0;i<2*n;i++){
22             cout<<(a[i]^temp);
23             if(i%2)cout<<endl;
24             else cout<<" ";
25         }
26     }
27     return 0;
28 }
View Code

 

posted on 2013-06-12 03:46  KimKyeYu  阅读(222)  评论(0编辑  收藏  举报

导航