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 }