Rikka with Prefix Sum

题意:

给出一个数组a,一开始全为0,现在有三种操作:

1.  1 L R W,让区间[L,R]里面的数全都加上W;

2.  2     将a数组变为其前缀和数组;

3.   3 L R 询问此时a数组区间[L,R]的和。

题解:

第一种操作我们可以简化为a[L]+W,a[R+1]-W,利用差分数组的思想。

接下来这一步使关键,考虑i这个位置有值a[i],然后经过多次2操作对后面的值的贡献,先可以从a[i]=1考虑,然后推广就是了= =

发现1这个数对后面位置的贡献随着位置的增加与组合数有关,这个可以自己去找下规律。

然后还有一个就是求区间和的时候,可以从组合数的性质C(i,j)=C(i-1,j-1)+C(i-1,j)去推导。

最后一点,由于一开始我们对区间修改是对点修改的,假设对点修改后进行了i次2操作,现在求区间和时,其实是求i+1次2操作后的区间和,这一步如果之前第二步推好了是很好解决的。

注意上面几点是息息相关的,需要自己耐心地找规律。

另外再稍微提醒一下,由于组合数二维数组预处理空间开不下,所以只能利用阶乘来算,后面取模时就涉及到了逆元。如果不清楚逆元可以去看看 费马小定理。

逆元可以直接用快速幂来求,但我直接求T了,所以用一个数组事先预处理一下...

因此要预处理两个数组出来,同时数组长度要开大一倍,这把上面推好了自然就知道了~

给出代码吧:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 2e5+,MOD = ;
  5. int t,n,m,tot;
  6. int l[N],r[N],w[N],s[N];
  7. ll fac[N],inv[N];
  8. ll qp(ll a,ll b){
  9. ll ans = ;
  10. while(b){
  11. if(b&) ans=ans*a%MOD;
  12. a=a*a%MOD;
  13. b>>=;
  14. }
  15. return ans ;
  16. }
  17. ll C(ll a,ll b){
  18. return fac[a]*qp(fac[b]*fac[a-b]%MOD,MOD-)%MOD;
  19. }
  20. ll query(ll L,ll R,ll cnt){
  21. if(L-<) return C(cnt+R+,R)%MOD;
  22. return ((C(cnt+R+,R)-C(cnt+L+,L-))%MOD+MOD)%MOD;
  23. }
  24. int main(){
  25. scanf("%d",&t);
  26. fac[]=;
  27. for(int i=;i<=2e5;i++) fac[i]=fac[i-]*i%MOD;
  28. while(t--){
  29. tot=;memset(s,,sizeof(s));
  30. scanf("%d%d",&n,&m);
  31. for(int i=;i<=m;i++){
  32. int op;
  33. scanf("%d",&op);
  34. if(op==){
  35. scanf("%d%d%d",&l[tot],&r[tot],&w[tot]);
  36. r[tot]++;
  37. tot++;
  38. }else if(op==) s[tot-]++;
  39. else{
  40. int L,R;
  41. scanf("%d%d",&L,&R);
  42. ll ans = ;
  43. int cnt = ;
  44. for(int i=tot-;i>=;i--){
  45. cnt+=s[i];
  46. if(l[i]<=R)
  47. ans=(ans+(ll)w[i]*query(max(l[i],L)-l[i],R-l[i],cnt-)%MOD)%MOD;
  48. if(r[i]<=R)
  49. ans=(ans-(ll)w[i]*query(max(r[i],L)-r[i],R-r[i],cnt-)%MOD+MOD)%MOD;
  50. }
  51. printf("%lld\n",ans);
  52. }
  53. }
  54. }
  55. return ;
  56. }

牛客网暑期ACM多校训练营(第十场)D Rikka with Prefix Sum (数学)的更多相关文章

  1. 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?

    牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...

  2. 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学

    牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...

  3. 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)

    2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...

  4. 牛客网暑期ACM多校训练营(第一场) - J Different Integers(线段数组or莫队)

    链接:https://www.nowcoder.com/acm/contest/139/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...

  5. 牛客网暑期ACM多校训练营(第九场) A题 FWT

    链接:https://www.nowcoder.com/acm/contest/147/A来源:牛客网 Niuniu has recently learned how to use Gaussian ...

  6. 牛客网暑期ACM多校训练营(第九场)D

    链接:https://www.nowcoder.com/acm/contest/147/D来源:牛客网 Niuniu likes traveling. Now he will travel on a ...

  7. 牛客网暑期ACM多校训练营(第二场)B discount

    链接:https://www.nowcoder.com/acm/contest/140/B来源:牛客网 题目描述 White Rabbit wants to buy some drinks from ...

  8. 2018牛客网暑期ACM多校训练营(第一场)D图同构,J

    链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...

  9. 牛客网暑期ACM多校训练营(第二场) I Car 思维

    链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 White Cloud has a square of n*n from (1,1) to (n ...

  10. 牛客网暑期ACM多校训练营(第二场) D money 思维

    链接:https://www.nowcoder.com/acm/contest/140/D来源:牛客网 White Cloud has built n stores numbered from 1 t ...

随机推荐

  1. 交换机基础配置之跨交换机划分vlan

    我们以上面的拓扑图来进行实验 四台pc机都在同一网段 pc1和pc2在同一台交换机上 pc3和pc4在同一台交换机上 现在我们实验的目的就是将pc1和pc3划分到同一vlan pc2和pc4划分到同一 ...

  2. [Ljava.lang.String; cannot be cast to java.lang.String报错的原因

    完整错误信息: java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String 报这个错的原因 ...

  3. linux下csv导出文件中文乱码问题

    近日在服务器端通过导出csv文件,将数据从linux服务器端保存到windows桌面端,以便用户可以通过excel打开使用数据. 但是在使用excel打开csv文件时,出现了中文乱码的情况,但是使用记 ...

  4. 腾讯首页分辨手机端与pc端代码

    腾讯首页分辨手机端与pc端代码 自己在做网页的时候在腾讯网首页借鉴的代码. 代码: <!-- 移动适配JS脚本 --> <script type="text/javascr ...

  5. java线程安全总结 - 1 (转载)

    原文地址:http://www.jameswxx.com/java/java%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E6%80%BB%E7%BB%93/ 最近想将ja ...

  6. python面向对象的约束和自定义异常

    基于人为来约束: 即人为主动抛出异常 class BaseMessage(object): def send(self,x1): """ 必须继承BaseMessage, ...

  7. 11 Django组件-分页器

    Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views here ...

  8. C#学习你需要知道的---(For和Foreach)

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52577283 作者:car ...

  9. Block那些事儿

    1.Block底层原理实现 首先我们来看四个函数 void test1() { int a = 10; void (^block)() = ^{ NSLog(@"a is %d", ...

  10. VS的几个实用快捷键

    Ctrl + K, D格式化代码 Ctrl + L 删除一行 Ctrl + K, S调出自动代码块 svm之后二下TAB 生成Main方法 Ctrl + K,C注释代码块Ctrl+K,U取消注释