题意:给一个序列A,设序列B的中的元素有(Ai+Aj)(1≤i,j≤n),那么求B中所有元素的异或之和。而序列A是这样来的:A1=0,Ai=(Ai−1∗m+z) mod l。
思路:相同的元素异或结果为0,所以可以去掉,也就是剩下A中的元素ai+ai那些而已。 小心乘法会溢出
#include <bits/stdc++.h>
#define INF 0x7f7f7f7f
#define pii pair<int,int>
#define LL long long
using namespace std;
const int N=*1e5+; int vect[N]; int main()
{
//freopen("input.txt", "r", stdin);
int t, n, m, z, l;
cin>>t;
while(t--)
{
scanf("%d %d %d %d",&n, &m, &z, &l);
memset(vect, , sizeof(vect));
LL pre=, big=;
for(int i=; i<n; i++)
{
vect[ (pre*m+z)%l ]++;
pre=(pre*m+z)%l ;
big=max(big, pre);
}
int ans=;
for(int i=; i<N; i++)
{
if( vect[i]%==)
{
ans^=(i+i);
}
}
printf("%d\n",ans); }
return ;
}
AC代码