题意:


思路:







#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 5e6 + 10;
int n;
int S_a,S_b,S_c,S_d,mod,mx;
int a[N];
bool check(int k){
    int b = a[1] - k;//越小越好
    for(int i = 2;i <= n;i++){
        if(a[i] >= b){
            b = max(a[i] - k,b);
        }else if(a[i] + k < b) return 0;
    } 
    return 1;
}
int f(int x){
    int x_a = 1ll * S_a * x % mod * x % mod* x % mod;
    int x_b = 1ll * S_b * x % mod * x % mod;
    int x_c = 1ll * S_c * x % mod;
    int x_d = S_d % mod;
    return (((x_a + x_b)%mod + x_c) % mod + x_d) % mod; 
}
int main(){
    scanf("%d %d %d %d %d %d %d",&n,&S_a,&S_b,&S_c,&S_d,&a[1],&mod);
    mx = a[1];
    for(int i = 2;i <= n;i++){
        a[i] = (f(a[i - 1]) + f(a[i - 2])) % mod;
        mx = max(mx,a[i]);
    }
    int l = 0,r = mx,ans = -1;
    while(l <= r){
        int mid = l + r >> 1;
        if(check(mid)){
            r = mid - 1;
            ans = mid;
        }else l = mid + 1;
    } 
    printf("%d\n",ans);
    return 0;
}