Problem Description
There is a number sequence {A}_{1},{A}_{2}....{A}_{n}A1,A2....An,you can select a interval [l,r] or not,all the numbers {A}_{i}(l \leq i \leq r)Ai(l≤i≤r) will become f({A}_{i})f(Ai).f(x)=(1890x+143) mod 10007f(x)=(1890x+143)mod10007.After that,the sum of n numbers should be as much as possible.What is the maximum sum?
Input
There are multiple test cases. First line of each case contains a single integer n.(1\leq n\leq {10}^{5})(1≤n≤105) Next line contains n integers {A}_{1},{A}_{2}....{A}_{n}A1,A2....An.(0\leq {A}_{i}\leq {10}^{4})(0≤Ai≤104) It's guaranteed that \sum n\leq {10}^{6}∑n≤106.
Output
For each test case,output the answer in a line.
Sample Input
2 10000 9999 5 1 9999 1 9999 1
Sample Output
1999922033
求个 差值然后求个连续和最大就好了
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 1e5 + 5; int n; long long a[maxn], b[maxn], c[maxn], sum, k; int main() { while (scanf("%d", &n) != EOF) { k = sum = 0; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); b[i] = (a[i] * 1890 + 143) % 10007; c[i] = b[i] - a[i]; sum += a[i]; } long long u = 0; for (int i = 1; i <= n; i++) { if (u + c[i] > 0) u = u + c[i]; else u = 0; if (u > k) k = u; } printf("%I64d\n", sum + k); } return 0; }