原题传送门
二分+贪心不解释
Code:
#include <bits/stdc++.h>
#define maxn 5000010
#define LL long long
using namespace std;
LL a[maxn], n, sa, sb, sc, sd, qy, b[maxn], ans;
LL F(LL x){ return sa * x % qy * x % qy* x % qy + sb * x % qy * x % qy + sc * x % qy + sd; }
bool check(LL mid){
b[1] = a[1] - mid;
for (int i = 2; i <= n; ++i){
if (a[i] - mid > b[i - 1]) b[i] = a[i] - mid; else b[i] = b[i - 1];
if (a[i] + mid < b[i - 1]) return 0;
}
return 1;
}
int main(){
scanf("%lld%lld%lld%lld%lld%lld%lld", &n, &sa, &sb, &sc, &sd, &a[1], &qy);
a[0] = 0;
for (int i = 2; i <= n; ++i) a[i] = (F(a[i - 1]) + F(a[i - 2])) % qy;
LL l = 0, r = qy;
while (l <= r){
LL mid = (l + r) >> 1;
if (check(mid)) ans = mid, r = mid - 1; else l = mid + 1;
}
printf("%lld\n", ans);
return 0;
}