版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41709770/article/details/81545278
题目
题解
–开始的时候就想到用前缀积优化了,但是由于不能除法取模(p不是质数呀QAQ)
谁知道可以用分块呢?
谁知道又可以用后缀积呢?
反正不是本蒟蒻233333
可以把原来的n个数,手动分成大小为k的n/k个区间(可能最后一个
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=2*1e7+5;
int n,k,p;
int A,B,C,D;
int s[MAXN];
int s1[MAXN],s2[MAXN];
int ans;
int main(){
freopen("range.in","r",stdin);
freopen("range.out","w",stdout);
cin>>n>>k>>p;
cin>>A>>B>>C>>D;
if(!k)
return 0;
s[1]=A;
for(int i=2;i<=n;i++)
s[i]=(s[i-1]*1LL*B+C)%D;
int lk=n/k;
for(int i=0;i<=lk;i++){
int l=i*k+1,r=min(n,l+k-1);
if(l>n)
break;
s1[l]=s[l];
for(int j=l+1;j<=r;j++)
s1[j]=(s1[j-1]*1LL*s[j])%p;
s2[r]=s[r];
for(int j=r-1;j>=l;j--)
s2[j]=(s2[j+1]*1LL*s[j])%p;
}
for(int i=1;i<=n-k+1;i++){
if(i%k==1)
ans^=s1[i+k-1];
else
ans
^=(s2[i]*1LL*s1[i+k-1])%p;
}
cout<<ans;
return 0;
}