Homework of English

来源:互联网 发布:2016最近网络最火的dj 编辑:程序博客网 时间:2024/06/05 19:19
Homework of EnglishThe English teacher give Nobita a very very strange homework.And Nobita am really doesn't konw why teacher gives him such a homwork.Perhaps that's because of Nobita's English is very bad.The homework is like this.There are a integer sequence a[1],a[2],...,a[N] of length N, and two integer P and M.And then there are Q queries.Each query contains two integers L and R.Nobita need to konw the value (a[L]*(P^0)+a[L+1]*(P^1)+a[L+2]*(P^2)+...+a[R]*(P^(R-L)))%M for each query.And for any two queries L1,R1 and L2,R2,if L1<L2 then R1<L2 or R1>=R2.InputThere are lots of test case.For each test case.The first line contains integers N,P,M.The second line contains integers a[0],b,c,dAnd the sequence a will be got through this four numbers, that is a[i]=(a[i-1]*b+c)%d for 1<=i<=N.The Third line contains a integer Q.The next Q lines each line contain two integers L and R.(1<=N<=5000000, 2<=P,M<=10^9, 1<=Q<=10^5, 1<=L<=R<=N, 1<=a[0],b,c,d<=10^9)OutputFor each query output one line.Contain a integer indicates the answer.Sample Input5 3 103 4 5 622 43 3Sample Output53

f[i]=ix=1a[x]px1
ans=f[R]f[L1]pL
然后给定的M不一定与P互素, PL关于M的乘法逆元不一定存在

前缀和不行,那就考虑一下后缀和……

f[i]=a[i]+a[i+1]p+a[i+2]p2+...+a[n]pi
ans=f[L]f[R+1]prl+1

#include<iostream>#include<cstdlib>#include<cstdio>#include<string>#include<vector>#include<deque>#include<queue>#include<algorithm>#include<set>#include<map>#include<stack>#include<ctime>#include<string.h>#include<math.h>#include<list>using namespace std;#define ll long long#define pii pair<int,int>const int inf = 1e9 + 7;const int N = 5e6+5;ll MOD;ll f[N];ll qPow(ll a,ll n){    ll ans=1;    ll t=a%MOD;    while(n){        if(n&1){            ans=(ans*t)%MOD;        }        n>>=1;        t=(t*t)%MOD;    }    return ans;}int main(){    //freopen("/home/lu/Documents/r.txt","r",stdin);    ll n,p;    while(~scanf("%lld%lld%lld",&n,&p,&MOD)){        ll a0,b,c,d;        scanf("%lld%lld%lld%lld",&a0,&b,&c,&d);        f[0]=a0;        for(int i=1;i<=n;++i){            f[i]=(f[i-1]*b+c)%d;        }        f[n+1]=0;        for(int i=n-1;i>=0;--i){            f[i]=(f[i+1]*p+f[i])%MOD;        }        int q;        scanf("%d",&q);        while(q--){            int l,r;            scanf("%d%d",&l,&r);            ll ans=((f[l]-f[r+1]*qPow(p,r-l+1))%MOD+MOD)%MOD;            printf("%lld\n",ans);        }    }    return 0;}
0 0
原创粉丝点击