【[SHOI2015]超能粒子炮·改】
就是运用\(Lucas\)推一个柿子
首先是前置芝士\(Lucas\)定理
\[C_{n}^{m}\%p=C_{n/p}^{m/p}*C_{n\%p}^{m\%p}\%p\]
至于证明
我建议去问一下Lucas本人
至于这道题,我们要求的是这个柿子
\[\sum_{i=0}^kC_{n}^i\%p\]
于是我们设\(f(n,k)=\sum_{i=0}^kC_{n}^i\)
我们就可以化柿子啦
\[f(n,k)=\sum_{i=0}^kC_{n}^i\]
\[\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }=\sum_{i=0}^kC_{n/p}^{i/p}*C_{n\%p}^{i\%p}\]
这个东西一看就很熟悉,\(n/p\)啊,显然跟整除分块差不多啊
\[=C_{n/p}^0\sum_{i=0}^{p-1}C_{n\%p}^i+C_{n/p}^1\sum_{i=0}^{p-1}C_{n\%p}^i+...+C_{n/p}^{k/p}\sum_{i=0}^{k\%p}C_{n\%p}^i\]
前面有\(0\)到\(k/p-1\)这些个整块,于是我们可以将\(\sum_{i=0}^{p-1}C_{n\%p}^i\)提出来
变成
\[\sum_{i=0}^{p-1}C_{n\%p}^i*(C_{n/p}^0+C_{n/p}^1+...C_{n/p}^{k/p-1})\]
那这个东西岂不是可以写成
\[f(n\%p,p-1)*f(n/p,k/p-1)\]
在加上那个不完整的块
\(\sum_{i=0}^{k\%p}C_{n\%p}^i\)可以写成\(f(n\%p,k\%p)\)
于是就有
\[f(n,k)=f(n\%p,p-1)*f(n/p,k/p-1)+C_{n/p}^{k/p}*f(n\%p,k\%p)\]
由于\(n\%p\)还有\(k\%p\)都小于\(2333\),所以\(f(n\%p,p-1)\)还有\(f(n\%p,k\%p)\)可以直接预处理好可以直接求出来
至于那个\(C_{n/p}^{k/p}\)就直接上\(Lucas\)好了
时间复杂度\(O(p^2+Tlog_{2333}^2n)\)
代码
非常sb的把\(C_0^0\)当成\(0\)WA了好几发
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define LL long long
#define maxn 2335
const int P=2333;
LL c[maxn+2][maxn+2];
LL f[maxn+2][maxn+2];
inline LL Lucas(LL n,LL m)
{if(!m) return 1;if(n==m) return 1;if(n<m) return 0;return c[n%P][m%P]*Lucas(n/P,m/P)%P;
}
inline LL F(LL n,LL k)
{if(k<0) return 0;if(!n) return 1;if(!k) return 1;if(n<P&&k<P) return f[n][k];return (F(n/P,k/P-1)*f[n%P][P-1]%P+Lucas(n/P,k/P)*f[n%P][k%P]%P)%P;
}
int main()
{int T;scanf("%d",&T);c[0][0]=1;for(re int i=1;i<=maxn;i++) c[i][i]=c[i][0]=1;for(re int i=1;i<=maxn;i++)for(re int j=1;j<i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%P;f[0][0]=1;for(re int i=1;i<=maxn;i++) f[i][0]=1;for(re int i=0;i<=maxn;i++)for(re int j=1;j<=maxn;j++)f[i][j]=(c[i][j]+f[i][j-1])%P;LL n,k;while(T--){scanf("%lld%lld",&n,&k);printf("%lld\n",F(n,k));}return 0;
}
转载于:https://www.cnblogs.com/asuldb/p/10206227.html
【[SHOI2015]超能粒子炮·改】相关推荐
- 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)
[BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ...
- P4345 [SHOI2015]超能粒子炮·改
P4345 [SHOI2015]超能粒子炮·改 题意: 求解式子∑i=0kCni%p\sum_{i=0}^{k}C_{n}^{i} \% p∑i=0kCni%p n,k<=1e18 题解: ...
- [2019.2.24]BZOJ4591 [Shoi2015]超能粒子炮·改
以下除法一律为整除. 求\(\sum_{i=0}^kC_n^i\ mod\ p,p=2333\) 设\(f(i,j)=\sum_{k=0}^jC_i^k\) \(f(n,k)=\sum_{i=0}^k ...
- BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)
注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...
- [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)
大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这 ...
- [SHOI2015] 超能粒子炮·改
题目链接:戳我 设\(f[n][k]=\sum_{i=0}^kC_n^i\pmod {2333}\) 那么根据卢卡斯定理我们知道\(f[n][k]=\sum_{i=0}^kC_{n/p}^{i/p}\ ...
- loj2038「SHOI2015」超能粒子炮・改(卢卡斯的理解和延伸+数位dp)
我们发现暴力+裸的卢卡斯可以骗到50分 所以就应该朝卢卡斯的方向去想. 卢卡斯是把n,k拆成两个p进制数进行统计的. 注意到如果在某一位ai>nia_i>n_iai>ni,a表示 ...
- P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】
正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 TTT组询问,给出n,kn,kn,k求 ∑i=0k(ni)\sum_{i=0}^{k}\bino ...
- 超能粒子炮·改 HYSBZ - 4591
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4591 就是求: C(n,0)+C(n,1)+... ...
最新文章
- 《游戏大师Chris Crawford谈互动叙事》一第 9 章 互动小说
- HTML有几种发音模式,html – 使用lang属性和拼音发音的正确方法是什么(如果有的话)?...
- 在Filter 无法跳转地址
- Android 中三种启用线程的方法
- matlab怎么求矩阵的范数
- 第三次学JAVA再学不好就吃翔(part2)--基础语法之注释
- 智能语音市场有多大? 阿里巴巴将如何破局后来者居上?
- maven 阿里下载源 setting.xml
- 第二人生的源码分析(9)登录界面显示
- 面向对象使用python-docx模块制作格式化文本(奖状生成器)
- 使用Picasso加载图片的内存优化实践
- 电偶极子的MATLAB场模拟
- 访问页面升级访问_BPC页面访问缓慢无报错
- 傅里叶级数的复数形式
- Grpc学习之map变量
- 八类网线和七类网线的区别_Cat8 八类网线是什么?与Cat5、Cat6、Cat7网线的区别?...
- 切换windows系统版本
- 域名注册条件有哪些?需要提交哪些材料?
- 深入浅出数据分析读书笔记
- ssm中小企业仓库管理信息系统毕业设计源码