题意: 给定长度为的序列
和
,求
,其中
,答案对
取模
数据范围:
题解:
先计算
- 首先考虑长度为
的
- 继续考虑长度为
的
,考虑取第一项的
的
,第二项
的
,...以此到最后一项取
的
。所以从第二项开始每项的第一个元素都多了出来即多了
,即答案为
- 再考虑长度为
的
,第一项取
的
,第二项取
,第三项取
,...最后一项取
得
;继续取第二项剩余的
,第三项的
,第四项的
,...最后一项的
得
,剩余可以取第三项的
,第四项的
,...倒数第二项的
,最后一项的
得:
。
所以得出结论为负责
为
对于:
- 继续考虑长度为
时,只有一个
- 再考虑长度为
时,只有
- 再考虑长度为
时,只有
可以发现长度为和长度为
的
一样,长度为
和长度为
一样,长度为
和长度为
一样。
长度为和长度为
一样。
注意: 当为奇数时,没有和
的
一样的长度。
代码:
#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; }