版权声明:我这么弱的蒟蒻,虽然博文不是很好,但也请标明转发地址喵! https://blog.csdn.net/ACerAndAKer/article/details/82177247
二分答案
不难发现,对于二元组a,b,b<a,那么让他们平衡的最优操作时让他们变成(a+b)/2,然后我们就可以通过二分一个mid,看看,是不是通过+x或减x能使数列合法
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
lli n,mod,ans;
lli sa,sb,sc,sd,a[5000500];
inline int read()
{
int x=0;char ch=getchar();
while (ch>'9'||ch<'0') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
inline lli F(lli x)
{
return (sa*x%mod*x%mod*x%mod+sb*x%mod*x%mod+sc*x%mod+sd)%mod;
}
inline bool che(lli x)
{
lli mks=-2e10;
for (int i=1;i<=n;i++)
{
mks=max(mks,a[i]-x);
if (a[i]+x<mks) return 1;
}
return 0;
}
signed main()
{
n=read();sa=read();sb=read();sc=read();sd=read();a[1]=read();mod=read();
for (int i=2;i<=n;i++) a[i]=(F(a[i-1])+F(a[i-2]))%mod;
int l=0,r=mod;
while (l<r)
{
int mid=(l+r)>>1;
if (che(mid)) l=mid+1;
else r=mid;
}
cout<<l;
return 0;
}