与唐林康的决战在即,面筋哥需要一件压场子的终极武器。
面筋哥手上有 M 个面筋,能量值分别为 1-M 的整数。现在面筋哥想要利用这些面筋制
作他的终极武器:Ex 面筋棒。Ex 面筋棒是一种能够发射强大剑气的能量武器。它由一些面
筋按次序连接而成。Ex 面筋棒可能会发射失败,面筋哥无法承受失败的损失。在 SPW 财团
的资助下,经过上百次的实验,面筋哥终于发现了面筋棒成功发射剑气的规律:
·面筋哥臂力有限,拿不动太长的 Ex 面筋棒,所以面筋棒的长度 L 不能大于 N,当然
它的长度不能为 0。
·每次发动攻击时,面筋棒会被触发 L 次,第 i 次触发会激活前 i 个面筋,进入蓄能状
态。
·首先剑气能量会聚集在已经激活的能量值最小的面筋上,然后能量会自发地寻找更高
的能量值,如果某一个面筋 x 的能量值是所有能量值大于当前面筋的面筋中(包括未激活的
面筋)最小的一个,那么剑气能量会转移到面筋 x 上,并提高至 s[x]。如果 x 未激活,则 Ex
面筋棒会由于能量溢出而发射失败。
·当发射能量达到当前已激活的面筋中的最大值,则第 i 次触发的能量聚集完成。
·只有当 L 次触发的能量全部完成聚集,Ex 面筋棒才能成功发射剑气。
面筋哥急切想击败唐林康,他想知道,利用他手上的面筋,能够制造出多少种不同的可
以成功发射剑气的 Ex 面筋棒。两种面筋棒不同当且仅当他们的长度不同,或某一个位置上
面筋能量不同。由于方案数太大,你只需要告诉他答案除以 19260817 的余数。
由于能量自发地提高违反了物理定律,这导致了时空的崩塌,世界线之间的隔阂被打破。
这时,你眼前突然出现了 Q 个来自各自世界的面筋哥,每个面筋哥都想知道方案总数,但
是他们拥有的面筋不一样,并且他们的臂力也不一样。你需要帮助每一个世界的面筋哥算出
方案总数。
另外面筋哥害怕自己表述不清而导致你理解出错,所以他悄咪咪地整理了一份更严谨的
表述,在早些时候放进了 ftp 里面。
【输入格式】
第一行一个正整数 Q,表示世界线的个数
接下来 Q 行,每行两个整数 M,N,表示该世界线中,面筋哥拥有 M 个面筋,能够拿动长度
至多为 N 的面筋棒。
【输出格式】
Q 行,每行一个整数,表示在该世界的条件下,能够成功发射的 Ex 面筋棒数量。
【样例输入 1】
1
4 4
【样例输出 1】
40
【样例解释】
将 Ex 面筋棒看做数列,则下列不同的组成都是能够成功发射的:
长度为 1:{1},{2},{3},{4}
长度为 2 : {1 2},{1 3},{1 4},{2 1},{2 3},{2 4},{3 1},{3 2},{3 4},{4 1},{4 2},{4 3}
长度为 3: {1 2 3},{1 2 4},{1 3 4},{2 1 3},{2 1 4},{2 3 1},{2 3 4},{2 4 1},{3 1 4},{3 2 1},{3 2 4},{3 4 1},{3
4 2},{4 2 1},{4 3 1},{4 3 2}
LULU随手组的数学题
有点毒瘤
我们发现由于题目的性质:
所以选出一些数的代价是相同的:为CmkC_{m}^{k}Cmk​
但是对于一段数它的代价是可以DP的
我们枚举当前最大的值的位置:
如果最大值在:第i号点
则后面是连续下降的。
所以代价是1
我们可以枚举前面的他实际是DP前缀和
打表出来就是O(2n)O(2^{n})O(2n)
然后我们现在要计算多次询问的答案:
∑i=1nCmi2i−1\sum_{i=1}^{n}C_{m}^{i}2^{i-1}∑i=1n​Cmi​2i−1
这是实际上是组合数的前缀和
而这个实际上可以莫队!
一个东西满足莫队只需要:
向四个方向都是O(1)O(1)O(1)转移的
设求解的东西是:SmnS_{m}^{n}Smn​
n的变化是很好求解的。
Smn−1=Smn−Cmn∗2n−1S_{m}^{n-1}=S_{m}^{n}-C_{m}^{n}*2^{n-1}Smn−1​=Smn​−Cmn​∗2n−1
Smn+1=Smn+Cmn+1∗2nS_{m}^{n+1}=S_{m}^{n}+C_{m}^{n+1}*2^{n}Smn+1​=Smn​+Cmn+1​∗2n
这直接是按照公式定义的
但是这实际上底也是可以同理的
观察:Sm+1nS_{m+1}^{n}Sm+1n​
它等价于:∑i=1nCm+1i∗2i−1\sum_{i=1}^{n} C_{m+1}^{i}*2^{i-1}∑i=1n​Cm+1i​∗2i−1
按照递推的转移式,可以拆解为:
∑i=1n(Cmi+Cmi−1)∗2i−1\sum_{i=1}^{n}(C_{m}^{i}+C_{m}^{i-1})*2^{i-1}∑i=1n​(Cmi​+Cmi−1​)∗2i−1
等价于Sm+1n=∑i=1n−13∗Cmi+Cm0∗20+Cmn∗2n−1S_{m+1}^{n}=\sum_{i=1}^{n-1}3*C_{m}^{i}+C_{m}^{0}*2^{0}+C_{m}^{n}*2^{n-1}Sm+1n​=∑i=1n−1​3∗Cmi​+Cm0​∗20+Cmn​∗2n−1
即:Sm+1n=3∗Smn−Cmn∗2n+Cm0∗20S_{m+1}^{n}=3*S_{m}^{n}-C_{m}^{n}*2^{n}+C_{m}^{0}*2^{0}Sm+1n​=3∗Smn​−Cmn​∗2n+Cm0​∗20
逆推得到:Sm−1n=Smn+Cm−1n−Cm0∗203S_{m-1}^{n}=\frac{S_{m}^{n}+C_{m-1}^{n}-C_{m}^{0}*2^{0}}{3}Sm−1n​=3Smn​+Cm−1n​−Cm0​∗20​
这就是莫队了
注意块的大小的取舍。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
inline void read(int &x){x=0;int f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
typedef long long LL;
const int N=1e5+100;
const LL mod=19260817;
LL Quick_Pow(LL x,int k){LL ret=1;while(k){if(k&1)ret=ret*x%mod;x=x*x%mod;k/=2;}return ret;
}
//
LL powtwo[N+10];
LL fac[N+10];
LL Inv[N+10];
LL inv3;
void Pre(){inv3=Quick_Pow(3,mod-2);powtwo[0]=1;for(int i=1;i<=N;++i)powtwo[i]=powtwo[i-1]*2%mod;fac[0]=1;for(int i=1;i<=N;++i)fac[i]=fac[i-1]*i%mod;Inv[N]=Quick_Pow(fac[N],mod-2);for(int i=N-1;i>=0;--i)Inv[i]=Inv[i+1]*(i+1)%mod;
}
LL C(int n,int m){  return fac[n]*Inv[n-m]%mod*Inv[m]%mod;
}
//
int Belong[N];
int Sqr;
LL now=1;
int l=1;
int r=1;
inline void rplus(){now=((3LL*now-C(r,l)*powtwo[l]%mod+C(r,0)*powtwo[0])%mod+mod)%mod;++r;
}
inline void rdelete(){now=((now+C(r-1,l)*powtwo[l]%mod-C(r,0)*powtwo[0])%mod+mod)%mod*inv3%mod;--r;
}
inline void lplus(){now=(now+C(r,l+1)*powtwo[l]%mod)%mod;++l;
}
inline void ldelete(){now=((now-C(r,l)*powtwo[l-1]%mod)%mod+mod)%mod;--l;
}
struct Query{int l,r,Id,ans;
}Q[N];
bool cmp(Query A,Query B){if(Belong[A.l]^Belong[B.l])return A.l<B.l;if(Belong[A.l]&1)return A.r<B.r;else return A.r>B.r;
}
bool cmp2(Query A,Query B){return A.Id<B.Id;
}
int cnt=0;
int Mx;
int main(){freopen("test.in","r",stdin);freopen("test.out","w",stdout);Pre();int testcase;read(testcase);for(int i=1;i<=testcase;++i){++cnt;read(Q[cnt].r);read(Q[cnt].l);Q[cnt].Id=i;Mx=max(Mx,Q[cnt].r);   }Sqr=sqrt(Mx);for(int i=1;i<=Mx;++i){Belong[i]=(i-1)/Sqr+1;}sort(Q+1,Q+1+cnt,cmp);for(int i=1;i<=cnt;++i){if(Q[i].r>=r){while(r<Q[i].r)rplus();while(r>Q[i].r)rdelete();while(l<Q[i].l)lplus();while(l>Q[i].l)ldelete(); }else{while(l<Q[i].l)lplus();while(l>Q[i].l)ldelete();while(r<Q[i].r)rplus();while(r>Q[i].r)rdelete();}Q[i].ans=now;}sort(Q+1,Q+1+cnt,cmp2);for(int i=1;i<=cnt;++i){cout<<Q[i].ans<<'\n';}
}

转载于:https://www.cnblogs.com/Leo-JAM/p/10079058.html

学习笔记:杨辉三角形上莫队(组合数莫队)(LULU胡策)相关推荐

  1. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  2. sv_labs学习笔记——sv_lab5_上(System Verilog)

    本节将介绍lab5的第一部分,主要总结一般设计学习与思考的方式与需要着重学习的点,同时以lab5作为参考,分析数据流流向,验证组件的通信与抽象化,实现的整体思路. sv_labs学习笔记--sv_la ...

  3. SiamRPN论文学习笔记(上)

    SiamRPN论文学习笔记(上) 引言 SiamRPN的网络结构 孪生子网络部分 区域候选子网络部分 RPN的诞生 区域候选子网络 训练阶段 两阶段训练 anchors尺寸设置 分类分支中anchor ...

  4. 小狐狸横版游戏开发学习笔记(上)

    小狐狸横版游戏开发学习笔记(上) 目录 小狐狸横版游戏开发学习笔记(上) 1.关于如何创建Tilemap 2.关于地图格子之间出现间隙的问题 3.如何设置自己想要的控制按键 4.如何解决玩家移动过程中 ...

  5. 莫队算法学习笔记(二)——带修莫队

    前言:什么是莫队 莫队算法,是一个十分优雅的暴力. 普通的莫队可以轻松解决一些离线问题,但是,当遇上了一些有修改操作的问题,普通莫队就无能为力了. 于是,改进后的莫队--带修莫队就这样产生了. L i ...

  6. 计算机组成原理学习笔记(上)

    计算机系统概论 计算机发展历程 原始计算工具 中国人的智慧之光 机械式计算机 西方人的智慧 机电式计算机 电子计算机 1,最古老的计算工具:算筹 2,冈特计算尺 3,达芬奇机械式计算机 4,1642年 ...

  7. SpringMVC框架--学习笔记(上)

    1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...

  8. 《商业洞察力30讲》学习笔记(上)

    [洞察力]| 作者 / Edison Zhou 这是恰童鞋骚年的第197篇原创文章 学习洞察力,也是新时代IT人员的一门进阶必修课... 1学习背景 2019年下半年至今,在领导的推荐下学习了刘润老师 ...

  9. 【学习笔记】JSP学习笔记(上)

    我是灼灼,一只初学Java的大一金渐层. 向往余秀华和狄兰·托马斯的疯狂,时常沉溺于将情感以诗相寄:追逐过王尔德.王小波的文字,后陷于毛姆和斯蒂芬·金不可自拔:热爱文学的浪潮,白日梦到底却总在现实里清 ...

  10. node.js学习笔记 - 文件上传(并用七牛云托管)

    文章目录 环境搭建 准备工作 安装相关依赖 代码实现 执行 环境搭建 准备工作 提示:本文采用ts来构建环境,要是以js构建则取掉类型定义即可. 初始化项目 创建目录fileUpload-demo- ...

最新文章

  1. R语言使用magick包的image_border函数和image_background函数自定义图像的边界和背景(Change image border and background)
  2. 位操作/获取数组的个数
  3. python调用random失败_python怎么调用random
  4. it计算机哪些专业术语,IT之家学院:笔记本电脑专业术语科普
  5. 界面设计方法 (2) — 3.卡式, 列表, 主细表, 树形, 页签
  6. 从年末生产故障解锁RocketMQ集群部署的最佳实践
  7. auto errored after 报错解决_漫谈数据倾斜解决方案(干货)
  8. 如何快速辨识四位数字贴片电阻阻值
  9. breadweb控制台下载_路由器刷breed助手下载
  10. [HDU - 3709] Balanced Number (数位dp)
  11. 获取微信公众号的关注链接地址
  12. python 估值模型_【中金固收·固收+】隐藏价值的角落:限售股AAP估值及Python实现方法(上)...
  13. 解密:斐讯N1为何火了?分享全套N1救砖指南!值得收藏
  14. 测开学习篇-html
  15. 微信公众号申请+新浪SAE申请
  16. 1-甲基-3-丁基咪唑四卤化铁([C4mim]FeX4,X=Cl,Br)磁性离子液体
  17. Excel -- 数据透视表
  18. 论文阅读 Jointly Optimize Data Augmentation and Network Training
  19. ZYNQMP_XAZU3EG_VxWorks7 添加USB2.0 USB3.0
  20. 从易中天说起:怎样的老师才是好老师

热门文章

  1. 网页表单form中提交的两种方式
  2. jsp_el内置对象pageContext和Cookie
  3. MySQL和Oracle的添加字段的处理差别
  4. Lua学习笔记9:多文件
  5. Android ListView中 每一项都有不同的布局
  6. 谢宝友:会说话的Linux内核
  7. 极大似然估计_一文读懂矩估计,极大似然估计和贝叶斯估计
  8. python自定义高阶函数_python基础知识5(集合,高级特性,高阶函数)
  9. java字符串字典排序_java实现对map的字典序排序操作示例
  10. Java NIO网络编程之群聊系统