wKiom1X-0v3iIiO6AAHZCGORb×××6.jpg

改题限制了l和n的大小,实际上l和n可以取无限大,很多人可能会想着开一个500000以上的数组,其实两个变量就解决问题了,时间复杂度是O(n),空间复杂度是O(1);


AC代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    long long A;
    int n, m, z, l;
    int t,i,j,r=0;
    long long sum = 0;
    scanf_s("%d", &t);
    for (i = 0; i < t; i++)
    {
        scanf_s("%d %d %d %d", &n, &m, &z, &l);
        A = 0;
        sum = 0;
        for (j = 0; j < n; j++)
        {
            sum = sum^A;
            A = (A * m + z) % l;
        }
        printf("%I64d\n", sum*2);
    }
    return 0;
}