jzoj 100035 区间

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_41709770/article/details/81545278