Homework of English
The 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.
Input
There 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,d
And 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)
Output
For each query output one line.
Contain a integer indicates the answer.
Sample Input
5 3 10
3 4 5 6
2
2 4
3 3
Sample Output
5
3
f[i]=∑ix=1a[x]∗px−1
ans=f[R]−f[L−1]pL
然后给定的M不一定与P互素,
PL
关于M的乘法逆元不一定存在
前缀和不行,那就考虑一下后缀和……
f[i]=a[i]+a[i+1]∗p+a[i+2]∗p2+...+a[n]p−i
ans=f[L]−f[R+1]∗pr−l+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;
}