题解:
最后一定是有两个数一个加,一个减,所以找出差距最大的逆序对除下2,向上取整就好了。
code:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;
LL a[5000000];
LL n,Sa,Sb,Sc,Sd,mod;
LL f(LL x){return (Sa*x%mod*x%mod*x%mod+Sb*x%mod*x%mod+Sc*x%mod+Sd)%mod;}
int main()
{
scanf("%lld %lld %lld %lld %lld %lld %lld",&n,&Sa,&Sb,&Sc,&Sd,&a[1],&mod);
for(LL i=2;i<=n;i++) a[i]=(f(a[i-1])+f(a[i-2]))%mod;
LL mx=a[1],ans=0;
for(LL i=2;i<=n;i++)
{
if(a[i]>=mx){mx=a[i];continue;}
ans=max(ans,(mx-a[i]+1)/2);
}
printf("%lld",ans);
}