版权声明:转载请注明出处。 https://blog.csdn.net/u014427196/article/details/47285335
MZL's xor
** Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K
(Java/Others)
Total Submission(s): 310 Accepted Submission(s): 225
**
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 ( A i + A j )( 1 ≤ i , j ≤ n )
The xor of an array B is defined as B 1 xor B 2 ...xor B n
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
A 1 = 0 , A i = ( A i − 1 ∗ m + z ) m o d l
1 ≤ m , z , l ≤ 5 ∗ 10 5 , n = 5 ∗ 10 5
Output
For every test.print the answer.
Sample Input
2 3 5 5 7 6 8 8 9
Sample Output
14 16
题意:求所有a[i]+a[j] 异或值,因为a[i]+a[j] 和a[j]+a[i] 会异或掉 所以只需考虑a[i]+a[i]
代码:
#include <stdio.h>
#include <ctime>
#include <math.h>
#include <limits.h>
#include <complex>
#include <string>
#include <functional>
#include <iterator>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <bitset>
#include <sstream>
#include <iomanip>
#include <fstream>
#include <iostream>
#include <ctime>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include <assert.h>
using namespace std;
long long n, m, z, l;
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%lld%lld%lld%lld", &n, &m, &z, &l);
long long ans = 0;
long long tmp = 0;
for (int i = 2; i <= n;i++)
{
tmp = (tmp *m + z) % l;
ans ^= (2 * tmp);
}
printf("%lld\n",ans);
}
return 0;
}
留言