(以下的 rir_i 下标从 00 开始)

题目要求我们求以下函数的最小值:

f(c)=i=0n1ir(i+c)modnf(c)=\sum_{i=0}^{n-1} i \cdot r_{(i+c) \bmod n}

观察发现,O(n)O(n) 求出 f(0)f(0)S=i=0n1\displaystyle S=\sum_{i=0}^{n-1} 后,f(i)f(i) 可以通过 f(i1)f(i-1)O(1)O(1) 求出:

f(i)=f(i1)S+nri1f(i)=f(i-1)-S+n \cdot r_{i-1}

直接求出 nn 个函数值后输出最小值即可。

#include <bits/stdc++.h>
using namespace std;
long long a[10000012], b[10000012];
int main()
{
    ios::sync_with_stdio(0);
	int n;
	cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        a[i + n] = a[i];
    }
    for (int i = 1; i <= n + n; i++)
        b[i] = b[i - 1] + a[i];
    long long ans = 0, aa = 0;
    for (int i = 1; i <= n; i++)
        ans += 1ll * a[i] * (i - 1);
    aa = ans;
    for (int i = 2, j = n + 1; i <= n; i++, j++)
    {
        aa -= b[j - 1] - b[i - 1];
        aa += 1ll * (n - 1) * a[j];
        ans = min(ans, aa);
    }
    cout << ans % 998244353 << endl;
	return 0;
}