[多校]MZL's xor

来源:互联网 发布:群星公主号 知乎 编辑:程序博客网 时间:2024/06/07 23:38
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...xor Bn
 

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,lA1=0,Ai=(Ai1m+z) mod l1m,z,l5105,n=5105
 

Output
For every test.print the answer.
 

Sample Input
23 5 5 76 8 8 9
 

Sample Output
1416
     xor为“异或”,“异或”的规律为,1^1=0,0^0=0,1^0=1,0^1=1。这道题的题意是把A数组数据全部递推得到后,将Ai和Aj两两相加(注意!题中没说j>i或i>j。即存在A1+A2和A2+A1的情况)而Ai+Aj和Aj+Ai为相同值,相同值的异或为0,0对于其他值异或,值不会有改变。所以最后异或的数据只有当i==j时的数。(对于研究了一个小时为什么只需要对i==j情况异或的我,知道了真相以后震惊了)
#include <iostream>#include <cstdio>using namespace std;long long a[600010];int main(){    int n,m,z,l,t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d%d%d",&n,&m,&z,&l);        a[1]=0;        for(int i=2; i<=n; i++)        {            a[i]=(a[i-1]*m+z)%l;        }        long long ans=a[1]+a[1];        for(int i=2;i<=n;i++)            ans^=(2*a[i]);        printf("%lld\n",ans);    }    return 0;}


0 0
原创粉丝点击