湖南省第十四届程序设计大赛K题CSU 2173:useFFT（前缀和）

Description
Bobo computes the product P(x)⋅Q(x)=c0 + c1x + … + cn + mxn + m for two polynomials P(x)=a0 + a1x + … + anxn and Q(x)=b0 + b1x + … + bmxm. Find (cL + cL + 1 + … + cR) modulo (109 + 7) for given L and R.

1 ≤ n, m ≤ 5 × 105
0 ≤ L ≤ R ≤ n + m
0 ≤ ai, bi ≤ 109
Both the sum of n and the sum of m do not exceed 106.
Input
The input consists of several test cases and is terminated by end-of-file.

The first line of each test case contains four integers n, m, L, R.

The second line contains (n + 1) integers a0, a1, …, an.

The third line contains (m + 1) integers b0, b1, …, bm.

Output
For each test case, print an integer which denotes the reuslt.

Sample Input
1 1 0 2
1 2
3 4
1 1 1 2
1 2
3 4
2 3 0 5
1 2 999999999
1 2 3 1000000000
Sample Output
21
18
5
Hint
Source
2018湖南省第14届大学生计算机程序设计竞赛

Author
ftiasch

#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
ll a[500050];
ll b[500050];
int main()
{
int n,m,l,r;
while(scanf("%d%d%d%d",&n,&m,&l,&r)!=EOF)
{
for(int i=0;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=0;i<=m;i++)
scanf("%lld",&b[i]);
ll num=0;
for(int i=l;i<=r&&i<=m;i++)
num=(num+b[i])%mod;
ll ans=0;
for(int i=0;i<=n;i++)
{
ans=(ans+a[i]*num)%mod;
l--;
if(l>=0&&l<=m) num=(num+b[l])%mod;
if(r>=0&&r<=m)
num=(num+mod-b[r])%mod;
r--;
}
printf("%lld\n",ans);
}
}