LG5178 求和

求和

给定数列 \(a_1...a_n\) 及 \(x_0\)。

满足

\[
f_{i.j}=\begin{cases}
a_i & j=0,i\leq n\x_0 & j=0,i=n+1\f_{i,j-1}+f_{i-1,j-1} & 0 < i,j \leq n+1,j < i\0 & i\leq j
\end{cases}
\]

\[
\sum_{i=0}^{n+1}\sum_{j=0}^{n+1}f_{i,j}
\]

但这样太水了

于是给出 \(m\) 个操作,每次将 \(a_l\dots a_r~(0\le l,r \le n)\) 加 \(p\),对于每个操作,输出答案。

特别地,若 \(0\) 在 \(l\dots r\) 范围内,我们认为 \(x_0\) 也加 \(p\)。

另外,在读入 \(m\) 个操作前,你也应该输出答案。

由于答案可能过大,输出答案对 \(1234567891\) 取模的结果。

\(n,m \leq 10^5\)。

题解

https://www.luogu.com.cn/blog/user7035/solution-p5178

大概可以画出这样的图:

行\列 0 1 2 3 ... n-1 n
1 a1 0 0 0 ... 0 0
2 a2 f2,1 0 0 ... 0 0
3 a3 f3,1 f3,2 0 ... 0 0
... ... ... ... ... ... ... ...
n an fn,1 fn,2 fn,3 ... fn,n-1 0
n+1 an fn+1,1 fn+1,2 fn+1,3 ... fn+1,n-1 fn+1,n

每个点都对右方和右下方的元素有贡献。那么

\[
f_{i,j}=\begin{cases}
0 & i\leq j\\sum_{k=0}^j\binom{j}{k}a_{i-k} & i>j
\end{cases}
\]

开始大力推式子。

\[
ans=\sum_{i=1}^{n+1}\sum_{j=0}^{i-1}f_{i,j}=\sum_{i=1}^{n+1}\sum_{j=0}^{i-1}\sum_{k=0}^j\binom{j}{k}a_{i-k}
\]

在这道题里面我们显然是要对组合数进行操作来减少求和符号的数量。

反复利用

\[
\sum_{i=m}^n\binom{i}{m}=\binom{n+1}{m+1}
\]

\[
ans=\sum_{i=1}^{n+1}\sum_{k=0}^{i-1}a_{i-k}\sum_{j=k}^{i-1}\binom{j}{k}\=\sum_{i=1}^{n+1}\sum_{k=1}^ia_k\sum_{j=i-k}^{i-1}\binom{j}{k}\=\sum_{i=1}^{n+1}\sum_{k=1}^ia_k\sum_{j=1}^k\binom{i-j}{i-k}\=\sum_{k=1}^{n+1}a_k\sum_{i=k}^{n+1}\sum_{j=1}^k\binom{i-j}{i-k}\=\sum_{k=1}^{n+1}a_k\sum_{j=1}^k\sum_{i=0}^{n+1-k}\binom{i+k-j}{i}=\sum_{k=1}^{n+1}a_k\sum_{j=1}^k\sum_{i=0}^{n+1-k}\binom{i+k-j}{k-j}\=\sum_{k=1}^{n+1}a_k\sum_{j=1}^k\binom{n-j+2}{k-j+1}=\sum_{k=1}^{n+1}a_k\sum_{j=1}^k\binom{n-j+2}{n-k+1}\=\sum_{k=1}^{n+1}a_k\sum_{j=n-k+2}^{n+1}\binom{j}{n-k+1}\=\sum_{k=1}^{n+1}a_k\left(\binom{n+2}{n-k+2}-1\right)
\]

维护系数的前缀和即可。时间复杂度 \(O(n+m)\)。

CO int N=6e5+10;
int fac[N],ifac[N];
int a[N],pool[N],*s=pool+1;

IN int binom(int n,int m){
    return mul(fac[n],mul(ifac[m],ifac[n-m]));
}
int main(){
    int n=read<int>(),m=read<int>();
    fac[0]=1;
    for(int i=1;i<=n+2;++i) fac[i]=mul(fac[i-1],i);
    ifac[n+2]=fpow(fac[n+2],mod-2);
    for(int i=n+1;i>=0;--i) ifac[i]=mul(ifac[i+1],i+1);
    for(int i=1;i<=n+1;++i)if(read(a[i])<0) a[i]+=mod;
    int ans=0;
    s[0]=binom(n+2,1)-1;
    ans=mul(a[n+1],s[0]);
    for(int i=1;i<=n;++i){
        s[i]=add(s[i-1],binom(n+2,n-i+2)-1);
        ans=add(ans,mul(a[i],binom(n+2,n-i+2)-1));
    }
    printf("%d\n",ans);
    while(m--){
        int l=read<int>(),r=read<int>(),p=read<int>();
        if(p<0) p+=mod;
        ans=add(ans,mul(add(s[r],mod-s[l-1]),p));
        printf("%d\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/autoint/p/12187362.html

时间: 2024-10-07 21:32:53

LG5178 求和的相关文章

cogs 36.求和问题

36. 求和问题 ★   输入文件:sum.in   输出文件:sum.out   简单对比时间限制:1.2 s   内存限制:128 MB [问题描述] 在一个长度为n的整数数列中取出连续的若干个数,并求它们的和. [输入格式] 输入由若干行组成,第一行有一个整数n    第二行有n个整数    第三行有一个整数m    下面m行,每行两个整数i与j(i<=j),表示求和的起始和终止位置. [输出格式] 输出有m行, 每行一个整数,表示这个数段数列的和. [输入样例] 输入文件 82 3 4

使用Linq求和方法Sum计算集合中多个元素和时应该注意的性能问题

提出问题 本文使用下面的实例来说明问题,以下是实例的完整代码. //************************************************************ // // Sum应用示例代码 // // Author:三五月儿 // // Date:2014/09/10 // // http://blog.csdn.net/yl2isoft // //**********************************************************

杭电 2015 偶数求和

http://acm.hdu.edu.cn/showproblem.php?pid=2015 偶数求和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 45044    Accepted Submission(s): 19675 Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序

HDU4027 Can you answer these queries 线段树区间求和+剪枝

给了你n,然后n个数字在一个数组中,接下来m个询问,每个询问三个数字 t,x,y,若t==0,那么修改区间[x,y]的每一个值,变为原来每个位置上的数 开根号取整,若t==1,那么对区间[x,y]求和 由于n,m,很大,所以树状数组铁定超时,若直接用线段树来做区间修改,那么也是超时,这类题目没别的方法了,静心剪枝,发现题目给的数据范围为2^63,有没有发现,2^63开根号 绝对不需要开10次,就能到1,到1以后就不需要再开了,意思就是若有某个区间[x,y]每一个点的值都为1时,这一段区间事实上是

7.03 对某列的值求和

问题:计算某个列中所有值的和,例如,计算所有职员的工资总额.解决方案:如果将整个表作为一个组或一个窗口求和,则只需对相应列使用SUM函数,而不要使用GROUP BY 子句:select sum(sal) from emp 如果创建了多个数据组或多个窗口,则使用SUM函数的同时,还要使用GROUP BY子句.下面例子将按部门计算职员的工资总额:select deptno,sum(sal) as total_for_dept from emp group by deptno;

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

【noip】noip201503求和

3. 求和 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 题目描述 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色colori用[1,m]当中的一个整数表示),并且写了一个数字numberi. 5 5 3 2 2 2 编号 1 2 3 4 5 6 定义一种特殊的三元组:(x, y, z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件: 组要求满足以下两个条件: 1.  xy

java课堂训练 参数求和

package demo; //20153173 Yulixiang 2016.9.20 public class CommandParameter {    public static void main(String[] args) {        System.out.println("the number:" +args.length);        int i,sum=0;        for(String arg:args){              i=Integ

poj3090欧拉函数求和

E - (例题)欧拉函数求和 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0