HDOJ-----5344---MZL's xor---思维

来源:互联网 发布:it到dt是什么意思 编辑:程序博客网 时间:2024/06/10 06:46

MZL's xor

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1279    Accepted Submission(s): 795


Problem Description
MZL loves xor very much.Now he gets an array A.The length of A is n.He wants to know the xor of all (Ai+Aj)(1i,jn)
The xor of an array B is defined as B1 xor B2...xorBn
 

Input
Multiple test cases, the first line contains an integer T(no more than 20), indicating the number of cases.
Each test case contains four integers:n,m,z,l
A1=0,Ai=(Ai1m+z)modl
1m,z,l5105,n=5105
 

Output
For every test.print the answer.
 

Sample Input
23 5 5 76 8 8 9
 

Sample Output
1416
给出A1,以及Ai的通项Ai=(Ai1m+z) mod  l,可以求出数列A,求所有的(Ai+Aj)^(Ap+Aq)                    0 < i,j,p,q <= n

      A1     A2

A1   1       2

A2   2       3

首先考虑上面这个表的性质,对角线两侧完全对称即会出现(A1+A2)^(A2+A1)

考虑异或的性质,二进制位相同为0,不同为1,a^a = 0

所以求所有的(Ai+Aj)^(Ap+Aq),对角线两侧对称,全部抵消为0,最终是求对角线(Ai+Ai)^(A(i+1)+A(i+1))^ …… ^(An+An)

最终即2*(Ai ^ …… ^ An)

#include<cstdio>#include<iostream>#include<cstring>#define LL long longusing namespace std;int main(){int t, n, m, z, l;cin >> t;while(t--){cin >> n >> m >> z >> l;LL a, ans;ans = a = 0;for(int i = 0; i < n; i++){ans ^= a;a = (a*m+z)%l;}cout << 2*ans << endl;}return 0;} 


0 0
原创粉丝点击