「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;
}

「SHOI2015」超能粒子炮・改的更多相关文章

  1. loj#2038. 「SHOI2015」超能粒子炮・改

    题目链接 loj#2038. 「SHOI2015」超能粒子炮・改 题解 卢卡斯定理 之后对于%p分类 剩下的是个子问题递归 n,k小于p的S可以预处理,C可以卢卡斯算 代码 #include<c ...

  2. 【LOJ】#2038. 「SHOI2015」超能粒子炮・改

    题解 用lucas随便分析一波就出来了 \(\binom{n}{k} = \binom{n % p}{k % p}\binom{n / p}{k / p}\) 那么对于一个余数r,如果r <= ...

  3. BZOJ 4591 【SHOI2015】 超能粒子炮·改

    题目链接:超能粒子炮·改 这道题的大体思路就是用\(lucas\)定理,然后合并同类项,就可以得到一个可以递归算的式子了. 我们用\(S(n,k)\)表示答案,\(p\)表示模数(\(2333\)是一 ...

  4. bzoj4591 【Shoi2015】超能粒子炮·改

    由Lucas定理C(n,k)=C(n/2333,k/2333)*C(n%2333,k%2333)%2333 则ans=ΣC(n,i),(i<=k)  =C(n/2333,0)*C(n%2333, ...

  5. Bzoj 4591: [Shoi2015]超能粒子炮·改 数论,Lucas定理,排列组合

    4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 178  Solved: 70[Submit][Stat ...

  6. bzoj 4591: [Shoi2015]超能粒子炮·改 [lucas定理]

    4591: [Shoi2015]超能粒子炮·改 题意:多组询问,求 \[ S(n, k) = \sum_{i=0}^n \binom{n}{i} \mod 2333,\ k \le n \le 10^ ...

  7. 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)

    [BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ...

  8. 洛谷 P4345 [SHOI2015]超能粒子炮·改 解题报告

    P4345 [SHOI2015]超能粒子炮·改 题意 求\(\sum_{i=0}^k\binom{n}{i}\),\(T\)组数据 范围 \(T\le 10^5,n,j\le 10^{18}\) 设\ ...

  9. bzoj4591 / P4345 [SHOI2015]超能粒子炮·改

    P4345 [SHOI2015]超能粒子炮·改 题意:求$\sum_{i=1}^{k}C(n,i)\%(P=2333)$ 肯定要先拆开,不然怎么做呢(大雾) 把$C(n,i)$用$lucas$分解一下 ...

随机推荐

  1. 014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 “字符型”字面值

    014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 "字符型"字面值 字符型 字面值如何表示? 两个关键:单引号(必须是英文单引号). ...

  2. 【学习笔记/题解】树上启发式合并/CF600E Lomsat gelral

    题目戳我 \(\text{Solution:}\) 树上启发式合并,是对普通暴力的一种优化. 考虑本题,最暴力的做法显然是暴力统计每一次的子树,为了避免其他子树影响,每次统计完子树都需要清空其信息. ...

  3. ansible-handlers变更执行操作

    1. ansible-handlers在变更执行操作  1) 编写playbook的handlers的配置文件 1 [root@test-1 bin]# vim /ansible/nginx/bin/ ...

  4. Cesium.Viewer

    <!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...

  5. MarkDown语法记录,还在用word,txt编写项目文档吗?

    开始之前 是不是在github上看项目的时候第一眼就要看项目介绍? 是不是经常在某些项目的代码里面看到一个README.MD文档 却不知道怎么写? 你是不是不知道,反正我是的. 作为一个程序员,可能写 ...

  6. 界面酷炫,功能强大!这款 Linux 性能实时监控工具超好用!

    对于维护.管理Linux系统来说,它的性能监控非常重要,特别是实时监控数据,这个数据有利于我们判断服务器的负载压力,及时调整资源调配,也有助于更好的服务于业务.所以,今天民工哥给大家安利一款 Linu ...

  7. python BeautifulSoup的使用方法

    BeautifulSoup的使用 我们学习了正则表达式的相关用法,但是一旦正则写的有问题,可能得到的就不是我们想要的结果了,而且对于一个网页来说,都有一定的特殊的结构和层级关系,而且很多标签都有id或 ...

  8. 【自学编程】C语言编程简单的小程序,计算长方体体积!

    计算长方体体积 有朋友会说长方体体积还不好算吗?长X宽X高.没错用计算器一下就可以出结果,编程反而麻烦些,但是我们说的是这种思维,如果复杂的重复运算的话写好程序就非常简单了. 简单运算下一个固定高度的 ...

  9. 身为电气人,为什么也要学习C语言编程?人生苦短,我学编程!

    说起编程大家可能都听过,但编程究竟是怎么一回事你弄懂了吗? 编程=对计算机程序进行编写,这些程序可以是现在手里拿着的手机.办公的电脑.你点击的页面.浏览的网页,都是有程序让它执行你要它做的事情. PL ...

  10. HDU - 6736 F - Forest Program

    题意 给你n个点m条边,并且保证整个图是仙人掌. 仙人掌:每条边仅属于1条或者0条回路 且无重边和自环 让你删掉一些边使其变成一棵树(拥有点数-1条边) 注意一个点也是森林 图可能是不联通的 思路 考 ...