「SHOI2015」超能粒子炮・改

给你\(T\)组询问,每组询问给定参数\(n,k\),计算\(\sum\limits_{i=0}^k\dbinom{n}{i}\).

\(T\leq10^5,n,k\leq10^{18}\).

这题其实是\(\operatorname{Lucas}\)定理的一个简单扩展。

首先利用\(\operatorname{Lucas}\)定理化简所求和式,由\(\dbinom{n}{m}=\dbinom{n/p}{m/p}\times\dbinom{n\%p}{m\%p}\pmod p\)得:

\[\begin{align*}
\sum_{i=0}^{k}\binom{n}{i}&=
\sum_{i=0}^k\binom{n/p}{i/p}\binom{n\%p}{i\%p}\\
&=\sum_{i=0}^{p-1}\binom{n\%p}{i}\sum_{j=0}^{k/p-1}\binom{n/p}{j}+\binom{n/p}{k/p}\sum_{i=0}^{k\%p}\binom{n\%p}{i}
\end{align*}
\]

在该和式中,\(\sum\limits_{i=0}^{p-1}\dbinom{n\%p}{i}\)和 \(\sum\limits_{i=0}^{k\%p}\dbinom{n\%p}{i}\)都可以用\(\Omicron(p^2)\)的时间复杂度预处理,而\(\dbinom{n/p}{k/p}\)可以利用\(\operatorname{Lucas}\)定理在\(\Omicron(\log_pn)\)的时间复杂度内计算。

所以我们只要能够计算出\(\sum\limits_{i=0}^{k/p-1}\dbinom{n/p}{i}\)就可以快速计算出\(\sum\limits_{i=0}^{k}\dbinom{n}{i}\),而这两个式子形式相同,并且每次\(n,k\)规模减半,所以可以递归解决,并且次数不超过\(\log n\)次。

所以总时间复杂度为\(\Omicron(T\log^2n)\).

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=2333;
int T,c[mod+5][mod+5],pre[mod+5][mod+5];
inline ll read(){
ll res=0,f_f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f_f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') res=(res<<3)+(res<<1)+(ch-'0'),ch=getchar();
return res*f_f;
}
inline void Gmo(int &x){
while(x<0) x+=mod;
while(x>=mod) x-=mod;
}
inline void init(){
c[0][0]=1;
for (int i=1;i<mod;i++){
c[i][0]=1;
for (int j=1;j<=i;j++){
c[i][j]=c[i-1][j-1]+c[i-1][j];
Gmo(c[i][j]);
}
}
for (int i=0;i<mod;i++){
pre[i][0]=c[i][0];
for (int j=1;j<mod;j++){
pre[i][j]=pre[i][j-1]+c[i][j];
Gmo(pre[i][j]);
}
}
}
inline int Lucas(ll n,ll m,int p){
if(m==0) return 1;
return 1ll*c[n%p][m%p]*Lucas(n/p,m/p,p)%p;
}
inline int calc(ll n,ll k,int p){
int x=1ll*Lucas(n/p,k/p,p)*pre[n%p][k%p]%mod;
if(k<p) return x;
int y=1ll*calc(n/p,k/p-1,p)*pre[n%p][p-1]%mod;
return (x+y)%mod;
}
int main(){
T=read(),init();
while(T--){
ll x=read(),y=read();
printf("%d\n",calc(x,y,mod));
}
return 0;
}

最新文章

  1. OC NSNumber NSValue
  2. [Test] 单元测试艺术(1) 基础知识
  3. 讲述一下自己在linux中配置ftp服务的经历
  4. CSS的样式合并与模块化
  5. proc_dir_entry
  6. SDH,WDM, OTN, MSTP,Ethernet, PTN, IP RAN
  7. (转)ASP.NET 2.0中的partial
  8. Unity 命令行参数
  9. JQuery常用动画实现函数
  10. CAS 之 Apereo CAS 简介(一)
  11. FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
  12. Java Script中常见操作
  13. zblog如何更改数据库配置以及生效
  14. [UOJ317]【NOI2017】游戏 题解
  15. python列表转字符串
  16. echart 单选legend 并排序
  17. 小程序encryptedData
  18. JS面试题(二)(常见算法编程)
  19. JavaScript的基础篇
  20. C和C++不容易发现的区别

热门文章

  1. Java高级特性1_流库_初体验
  2. 批处理中的删除命令:del
  3. (转)DBC文件格式解析
  4. 《C++primerplus》第7章练习题
  5. spring-boot-route(九)整合JPA操作数据库
  6. RHSA-2019:0201-低危: systemd 安全更新
  7. 35岁老半路程序员的Python从0开始之路
  8. mysql物理优化器代价模型分析【原创】
  9. 多测师接口测试 --常见的接口面试题目002---高级讲师肖sir
  10. 面经手册 &#183; 第13篇《除了JDK、CGLIB,还有3种类代理方式?面试又卡住!》