gaiti D6T3

#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;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值