link

输入\(n,k\),求\(\sum_{i=0}^k{n\choose i}\)对2333取模,10万组询问,n,k<=1e18

注意到一个2333这个数字很小并且还是质数这一良好性质,我们可以根据Lucas定理优化式子

为了方便,令\(p=2333\)

设\(f(n,k)=\sum_{i=0}^k{n\choose i}\)

对于\(i\in[0,p\lfloor\frac kp\rfloor)\),根据lucas定理有\({n\choose i}={n\%p\choose i\%p}{n/p\choose i/p}\)

对于每一对\((i\%p,i/p)\)都能惟一确定一个\(i\),根据乘法原理有

\(f(n\%p,p-1)*f(\lfloor\frac np\rfloor,\lfloor\frac kp\rfloor-1)\)

对于\(i\in[p\lfloor\frac kp\rfloor,k]\)则它们/p的值相同,根据Lucas定理可以化为\({\lfloor\frac np\rfloor\choose\lfloor\frac kp\rfloor}*f(n\%p,k\%p)\)

所以\(f(n,k)=f(n\%p,p-1)*f(\lfloor\frac np\rfloor,\lfloor\frac kp\rfloor-1)+{\lfloor\frac np\rfloor\choose\lfloor\frac kp\rfloor}*f(n\%p,k\%p)\)

先预处理0p-1阶乘及其逆元,0p-1里的组合数可以O(1)

注意到在f的递推式中频繁用到了0~p-1内的f值,所以先O(p^2)处理这些f

那么时间复杂度递推式就是\(T(n,k)=T(\lfloor\frac np\rfloor,\lfloor\frac kp\rfloor)+\log p\),如果nk同阶,复杂度\(O(T\log n\log ^2p)\)好像是

一开始复杂度写错了,最后6个点狂T。。。

代码

#include <cstdio>
using namespace std; const int p = 2333; int fac[3000], inv[3000];
int f[3000][3000]; int qpow(int x, int y)
{
int res = 1;
for (x %= p; y > 0; x = x * x % p, y >>= 1) if (y & 1) res = res * x % p;
return res;
} int c(long long n, long long m)
{
if (n < m || m < 0) return 0;
if (n < p && m < p) return fac[n] * inv[m] % p * inv[n - m] % p;
return c(n / p, m / p) * c(n % p, m % p) % p;
} int work(long long n, long long k)
{
if (n < p && k < p) return f[n][k];
return (c(n / p, k / p) * work(n % p, k % p) + work(n % p, p - 1) * work(n / p, k / p - 1)) % p;
} int main()
{
fac[0] = 1;
for (int i = 1; i < p; i++)
fac[i] = fac[i - 1] * i % p;
inv[p - 1] = qpow(fac[p - 1], p - 2);
for (int i = p - 1; i >= 1; i--)
inv[i - 1] = inv[i] * i % p;
for (int i = 0; i < p; i++)
{
f[i][0] = c(i, 0);
for (int j = 1; j < p; j++)
f[i][j] = (f[i][j - 1] + c(i, j)) % p;
}
int t; scanf("%d", &t);
while (t --> 0)
{
long long x, y;
scanf("%lld%lld", &x, &y);
printf("%d\n", work(x, y));
}
return 0;
}

WA了好几发,define int long long过了后来发现计算C时候三个数乘一起就炸int了。。。

luogu4345 [SHOI2015]超能粒子炮·改(组合数/Lucas定理)的更多相关文章

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

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

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

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

  3. 【BZOJ4591】超能粒子炮·改(Lucas定理,组合计数)

    题意: 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提 ...

  4. Luogu4345 SHOI2015 超能粒子炮·改 Lucas、数位DP

    传送门 模数小,还是个质数,Lucas没得跑 考虑Lucas的实质.设\(a = \sum\limits_{i=0}^5 a_i 2333^i\),\(b = \sum\limits_{i=0}^5 ...

  5. bzoj 4591 [Shoi2015]超能粒子炮·改——组合数前缀和

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4591 先说说自己的想法: 从组合意义的角度考虑,从n个里选<=k个,就添加k个空位置, ...

  6. BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)

    注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...

  7. P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】

    正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 \(T\)组询问,给出\(n,k\)求 \[\sum_{i=0}^{k}\binom{n}{i} ...

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

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

  9. Lucas(卢卡斯)定理模板&&例题解析([SHOI2015]超能粒子炮·改)

    Lucas定理 先上结论: 当p为素数: \(\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)\) ...

随机推荐

  1. Oracle RMAN 学习

    Oracle RMAN 学习:三思笔记 1 进入rman Rman--物理备份(结构/数据) 1 本地db Cmd set oracle_sid=orcl 1 rman target / Rman&g ...

  2. css之content

    content 属性与 :before 及 :after 伪元素配合使用,来插入生成内容.该属性用于定义元素之前或之后放置的生成内容.默认地,这往往是行内内容,不过该内容创建的框类型可以用属性 dis ...

  3. Android ListView 设置

    android:minHeight="80dip"//设置每一条的高度 android:divider="@null" //设置默认的分割线不显示 androi ...

  4. python笔记--4--面向对象

    面向对象 Python中对象的概念很广泛,Python中的一切内容都可以称为对象,除了数字.字符串.列表.元组.字典.集合.range对象.zip对象等等,函数也是对象,类也是对象. 在Python中 ...

  5. java中的面向对象的三大基本特征

    转载,原文来自http://blog.sina.com.cn/s/blog_5f79a56a0100c6ig.html 众所周知,java中的面向对象的三大基本特征是:[封装].[继承].[多态] 一 ...

  6. var_dump — 打印变量的相关信息

    <?php $a = array( 1 , 2 , array( "a" , "b" , "c" )); var_dump ( $a ...

  7. SQLServer+.net 事务锁表问题

    最近操作Sqlserver遇到一个锁表问题.找了好久才搞明白原因和解决办法. 故障现象: 每次启动事务后,执行了删除或者修改操作以后,再执行查询操作就锁表. 解决过程: 1:最初以为SQLServer ...

  8. IO流框架关系总结(关系图)

    字节流和字符流关系图  打印流和序列化流关系图

  9. php单引号双引号的区别

    单引号里面的内容是直接被当做一个字符串,用双引号定义的字符串的内容最只要的特征就是会被解析.

  10. Python程序设计5——函数

    本章介绍Python中模块和函数的概念. Python程序是由包.模块和函数三者组成,包是由一系列模块组成的集合,模块是处理某一类问题的函数和类的集合.Python提供的许多工具包和模块安装在Pyth ...