题意: 给定长度为的序列,求,其中,答案对取模
数据范围

题解:
先计算

  • 首先考虑长度为
  • 继续考虑长度为,考虑取第一项的,第二项,...以此到最后一项取。所以从第二项开始每项的第一个元素都多了出来即多了,即答案为
  • 再考虑长度为,第一项取,第二项取,第三项取,...最后一项取;继续取第二项剩余的,第三项的,第四项的,...最后一项的,剩余可以取第三项的,第四项的,...倒数第二项的,最后一项的得:
    所以得出结论为负责
    对于
  • 继续考虑长度为时,只有一个
  • 再考虑长度为时,只有
  • 再考虑长度为时,只有
    可以发现长度为和长度为一样,长度为和长度为一样,长度为和长度为一样。
    长度为和长度为一样。

注意:为奇数时,没有和一样的长度。

代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 3e5 + 10;
const int mod = 1e9 + 7;
ll all[N], w[N];
int n;
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%lld", &all[i]), all[i] += all[i - 1];
    for(int i = 1; i <= n; i++) scanf("%lld", &w[i]);

    ll temp = 0, res = 0;
    for(int i = 1; i * 2 <= n + 1; i++) {
        (temp += all[n - (i - 1)] - all[i - 1]) %= mod;
        (res += (w[i] + ((i * 2 == n + 1) ? 0 : w[n - (i - 1)])) * temp) %= mod;
    } 
    printf("%lld\n", res);

    return 0;
}