#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
long long f;
long long r;
long long low[1200000];
long long l;
long long sum[1200000];
long long kun[1200000];
void add(long long x,long long b)
{
while(x<=l)
{
sum[x]=sum[x]+b;
x=x+low[x];
}
}
void daa(long long x,long long b)
{
while(x<=l)
{
kun[x]=kun[x]+b;
x=x+low[x];
}
}
long long get(long long a,long long b)
{
long long ret=0;
long long x=b;
while(x>=1)
{
ret=ret+sum[x];
x=x-low[x];
// cout<<x<<" ";
}
//if(a==16) cout<<endl<<ret<<endl;
//if(a==6&&b==l) cout<<ret<<"silly0";
return ret;
}
long long got(long long a,long long b)
{
long long ret=0;
long long x=b;
while(x>=1)
{
ret=ret+kun[x];
x=x-low[x];
}
//if(a==16) cout<<endl<<ret<<endl;
return ret;
}
long long Mod;
int main()
{
long long n;
long long x0;
long long a,b;
cin>>n>>l>>x0>>a>>b;
for(long long i=1;i<=l+2;i++)
{
low[i]=i&(-i);
}
// cout<<"silly you are";
Mod=1000000007;
x0=x0%l;
long long nowx;
nowx=x0;
add(nowx,1);
// cout<<get(16,l)<<"ae";
daa(nowx,nowx-1);
long long plax;
long long anss=1;
long long num2;
long long num1;
if(n>=2)
{
plax=(nowx*a+b)%l;
daa(plax,plax-1);
if(nowx>plax){
r=nowx-plax;
f=0;
anss=r; }
else if(nowx<=plax){
f=plax-nowx;
r=0;
anss=f; }
}
add(plax,1);
// cout<<got(1,20)<<"ert ";
long long sum=anss;
for(int i=3;i<=n;i++)
{
nowx=(plax*a+b)%l;//cout<<nowx;
// if(nowx>plax){
// int p=get(plax+1,nowx);
// int g=get(plax-1,nowx);
// int h=get(nowx,l);
// }
if(nowx>plax){
long long p=get(plax+1,nowx)-get(1,plax-1);
long long g=get(1,plax-1);
// cout<<get(1,60)<<" aa"<<get(2,95);
// cout<<k1<<" "<<k2;
long long h=get(nowx,l)-get(1,nowx-1);
f=f+(nowx-plax)*g;
long long kwq=got(plax,nowx)-got(1+1,plax-1);
long long qqw=kwq-p*(plax-1);
r=r-qqw;
f=f+(nowx-1)*p-qqw;
r=r-(nowx-plax)*h;
add(nowx,1);
daa(nowx,nowx-1); }
else if(nowx<plax){
long long p=get(1,nowx-1);//cout<<"silly ypius";
long long g=get(nowx,plax)-get(1,nowx-1);
long long h=get(plax+1,l)-get(1,plax);
r=r+(plax-nowx)*h;
// cout<<get(16,l)<<"aa"<<get(1,15)<<"wr"<<plax<<"s "<<nowx<<plax-nowx<<"aeq"<<h<<"ar"<<(plax-nowx)*h<<"aakd"<<endl;
long long kwq=got(nowx,plax-1)-got(1,nowx-1);
long long qqw=kwq-g*(nowx-1);
r=r+qqw;
f=f-((plax-1)*g-kwq);
f=f-(plax-nowx)*p;
add(nowx+1,1);
daa(nowx+1,nowx-1); }
// cout<<i<<"qq"<<f<<"aa"<<r<<"silly";
long long qq=f+r;
anss=anss*(f+r)%Mod;
// cout<<f<<" "<<r<<" "<<nowx<<" "<<plax<<endl;
plax=nowx;
// cout<<i<<" ";
}
cout<<anss;
// cout<<n<<" "<<l<<" "<<x0<<" "<<a<<" "<<b;
return 0;
}
gaiti D6T3
最新推荐文章于 2024-05-27 19:45:26 发布