题面:

  http://codeforces.com/problemset/problem/407/C

  一句话题意:给一个长度为n的序列g,m次操作,每次操作(l,r,k)表示将g[l]~g[r]的每个数g[j](l<=j<=r)加上c(j-l+k,k),输出经过m操作后的最终序列(mod 1e9+7)(n,m<=1e5,k<=100)。

题解:

  首先看到这个题瞬间想到数据结构,但发现一次修改操作中每个点的增加值都不同后果断放弃。又因为发现这题只有一次询问,就考虑能不能先将每次操作存下来,最后再进行统一递推。又看到了k好小。。于是就可以乱搞了!

  我们先考虑组合数的递推,c(n,m)=c(n-1,m)+c(n-1,m-1)。那么观察操作,假设我们在修改g[x],并且x>l,那么g[x-1]已经修改完了,考虑g[x-1]的增加值为c(x-1-l+k,k),而g[x]的值增加了c(x-l+k,k),又因为c(x-l+k,k)=c(x-l-1,k)+c(x-l-1,k-1),但是,显然只存下每个点的c(x-l+k,k)和每个点的c(x-l+k,k-1)是远远不够的,因为这样的话就只能推出c(x-l+k+1,k),而无法推出c(x-l+k+1,k-1),接着就无法推出c(x-l+k+2,k),等于说这次操作就无法递推完。因此我们只要在每一次操作的l处处理出c(k,0~k),就可以做到递推出每次操作对于每个数的增加值,欸那这有什么用呢,欸当然有用了!又因为加法有交换律和结合律,所以我们只要在每个l上计算好,在r+1处减去,就可以O(n)递推出整个序列!因为每在一个l处要处理c(k,0~k),处理m次,所以操作的总复杂度为O(mk),最终递推每推一步都要推k次组合数。因此整套代码的总复杂度为O(mk+nk)!!!!!

  如果还有不懂的那就看代码然后感性理解一下qwq

  P.S. 对于组合数我们是要处理阶乘的逆元(inv)的,有一个O(n)递推1~n逆元的方法:

    首先我们考虑如果知道了x+1~n的阶乘的inv,如何得到x!的inv。。

    根据逆元的定义:n!*inv(n!)=(n-1)!*n*inv(n!)=1=(n-1)!*inv((n-1)!),,欸所以inv((n-1)!)=inv(n!)*n

代码:

 #include<bits/stdc++.h>

 using namespace std;

 typedef long long ll;
typedef double dd;
const int maxn=1e5+;
const ll p=1e9+;
ll fac[maxn],inv[maxn],g[maxn],ad[maxn][];
int n,m; ll qpow(ll x,ll b){
ll sum=;
while(b){
if(b&) sum=sum*x%p;
x=x*x%p; b>>=;
}
return sum;
} void init(){
fac[]=;
for(int i=;i<=;i++)
fac[i]=(ll)i*fac[i-]%p;
inv[]=qpow(fac[],p-);
for(int i=-;i>=;i--)
inv[i]=(ll)inv[i+]*(i+)%p;
} ll c(int x,int y){
if(x<y) return ;
return fac[x]*inv[y]%p*inv[x-y]%p;
} int main(){
scanf("%d%d",&n,&m);
init();
for(int i=;i<=n;i++)
scanf("%lld",&g[i]); int l,r,k;
for(int j=;j<=m;j++){
scanf("%d%d%d",&l,&r,&k);
for(int i=;i<=k;i++)
ad[l][i]=(ad[l][i]+c(k,k-i))%p,
ad[r+][i]=(ad[r+][i]-c(r+-l+k,k-i)+p)%p;
} for(int i=;i<=n;i++)
for(int j=;j>=;j--)
ad[i][j]=(ad[i][j]+ad[i-][j]+ad[i-][j+]+p)%p; for(int i=;i<=n;i++)
printf("%lld ",(g[i]+ad[i][]+p)%p); return ;
}

CodeForces 407C 组合数学(详解)的更多相关文章

  1. 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)

    原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解    By 岩之痕 目录: 一:综述 ...

  2. 详解OJ(Online Judge)中PHP代码的提交方法及要点【举例:ZOJ 1001 (A + B Problem)】

    详解OJ(Online Judge)中PHP代码的提交方法及要点 Introduction of How to submit PHP code to Online Judge Systems  Int ...

  3. SQLServer 常见SQL笔试题之语句操作题详解

    SqlServer 常见SQL笔试题之语句操作题详解 by:授客 QQ:1033553122 测试数据库 CREATE DATABASE handWriting ON PRIMARY ( name = ...

  4. codeforces 407C Curious Array

    codeforces 407C Curious Array UPD: 我觉得这个做法比较好理解啊 参考题解:https://www.cnblogs.com/ChopsticksAN/p/4908377 ...

  5. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  6. dsu on tree (树上启发式合并) 详解

    一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1.前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有 ...

  7. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  8. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  9. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

随机推荐

  1. Lumen与laravel的区别

    Lumen与laravel的区别   困惑 一直都无法很友好的理解Lumen与Laravel之间的区别,只知道他们是非常相似的两个php框架,使用方法什么的都差不多. 为什么要解惑 最近接手了公司的一 ...

  2. Oracle 备份表数据

    --备份表数据 select * from t_owners; --创建备份表 create table t_owners_copy ( id number, name ), addressid nu ...

  3. springIOC源码分析(BeanFactroy)

    启动spring容器加载bean的方式有两种:最基本的容器BeanFactory和高级容器ApplicationContext.这篇文章介绍使用BeanFactory加载bean时的整个过程,当然,A ...

  4. C# Note19: Windows安装包制作实践

    前言 最近在项目中需要不断更新新版本的software installer(软件安装包),于是便查阅资料,整理了下制作方法. NSIS安装包制作脚本 NSIS(Nullsoft Scriptable ...

  5. HTML5经典实例——1基础语法和语义

    1指定DOCTYPE 在页面的最开始处指定HTML5 DOCTYPE DOCTYPE是不区分大小写的.可以任意的使用大小写. <!DOCTYPE html> <html lang=& ...

  6. Prism框架中加载类库中时其中第三方类dll提示无法加载程序集

    Prism框架是采用一种依赖注入的方式动态加载程序集,能够在程序需要加载的时候将程序集注入到里面去,实现程序的热插拔效果,而且采用这种框架能够让我们进行一个大项目的独立开发,在最近的一个项目中在独立开 ...

  7. 让PC端页面在手机端显示缩小版的解决方法

    做页面的时候我们做好pC端页面时,因编辑那边需求,在手机端页面也应该是缩小版,不能乱的.在网上找了各种解决方案,经实验,这种是可以的: 在head里边加上这两句meta  <meta name= ...

  8. python设计模式第九天【策略模式】

    1. 定义 对一系列算法进行封装,为所有算法定义一个抽象的算法接口,可以平滑的进行算法切换 2. 策略模式的UML图 3.代码实现 #!/usr/bin/env python #! _*_ codin ...

  9. 老男孩python学习自修第十五天【常用模块之time】

    例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import time if __name__ == "__main__": pr ...

  10. HTML5-Input

    HTML5拥有多个新的表单输入类型,这些新特性提供了更好的输入控制和验证(有的浏览器不支持) color.date.datetime.datetime-local.email.month.number ...