luogu4345 [SHOI2015]超能粒子炮·改(组合数/Lucas定理)
输入\(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定理)的更多相关文章
- Bzoj 4591: [Shoi2015]超能粒子炮·改 数论,Lucas定理,排列组合
4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 178 Solved: 70[Submit][Stat ...
- 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)
[BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ...
- 【BZOJ4591】超能粒子炮·改(Lucas定理,组合计数)
题意: 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提 ...
- Luogu4345 SHOI2015 超能粒子炮·改 Lucas、数位DP
传送门 模数小,还是个质数,Lucas没得跑 考虑Lucas的实质.设\(a = \sum\limits_{i=0}^5 a_i 2333^i\),\(b = \sum\limits_{i=0}^5 ...
- bzoj 4591 [Shoi2015]超能粒子炮·改——组合数前缀和
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4591 先说说自己的想法: 从组合意义的角度考虑,从n个里选<=k个,就添加k个空位置, ...
- BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)
注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...
- P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】
正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 \(T\)组询问,给出\(n,k\)求 \[\sum_{i=0}^{k}\binom{n}{i} ...
- bzoj4591 / P4345 [SHOI2015]超能粒子炮·改
P4345 [SHOI2015]超能粒子炮·改 题意:求$\sum_{i=1}^{k}C(n,i)\%(P=2333)$ 肯定要先拆开,不然怎么做呢(大雾) 把$C(n,i)$用$lucas$分解一下 ...
- Lucas(卢卡斯)定理模板&&例题解析([SHOI2015]超能粒子炮·改)
Lucas定理 先上结论: 当p为素数: \(\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)\) ...
随机推荐
- MySQL执行计划的讲解
最近同事在执行线上执行一条MySQL的查询语句,数据的话在9000条左右,但使用左连接的时候查询速度大概在15秒左右~这速度确实是无法接受的~ 经过简单的修改,变为内连接的话,执行速度不到1秒. 下面 ...
- git学习5 ecipse集成git(转载)
原文地址:http://blog.csdn.net/hhhccckkk/article/details/10458159 有的eclipse已经自带了GIt了,就不用安装了 1: 进行安装Git,和安 ...
- ECS Windows系统使用自带监视器查看IIS并发连接数
问题现象 ECS Windows系统如何查看IIS并发连接数? 解决方案 1.运行-->输入“perfmon.msc” . 2.在“系统监视器”图表区域里点击右键,然后点“添加计数器”. 3.在 ...
- catkin 工作空间
catkin 工作空间:组织和管理功能包的文件夹,以 catkin 工具编译 建立工作空间 sch01ar@ubuntu:~$ mkdir -p ~/catkin_ws/src sch01ar@ubu ...
- java 多线程系列基础篇(十一)之生产消费者问题
1. 生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”.“消费者”.“仓库”和“产品”.他们之间的关系如下:(01) 生产者仅仅在仓储未满时候生产,仓满则停止生产 ...
- DDD学习笔录——简介DDD的战术模式、问题空间和解空间
DDD的战术模式 DDD的战术模式(也称为模型构造块)是一个帮助创建 用于复杂有界上下文的有效模型的 模式集合. 也就是我们常说的设计模式. 问题空间 问题空间将问题域提炼成更多可管理的子域,是真对于 ...
- leetcode482
这道题主要使用了C++的几个API,大小写转化,字符串替换.其余的逻辑都比较简单.而且经查资料,string类字符串拼接的速度使用+=的速度是很快的.以下代码,也是用的+=来拼接字符串. string ...
- k8s cookbook读书笔记 第二章
走一遍概念 An overview of Kubernetes control f Working with pods f Working with a replication controller ...
- Mysql Hive 通用的行列转换
就是简单的一个字符串拼接,意义和所用场景自己体会下 insert into table agent_library1 select concat_ws(':',collect_set(name)) a ...
- hibernate第三天 一对多 , 多对多
1.1. 阐述你对inverse的理解 答: 1.inverse的默认值是false,代表不放弃外键维护权,配置值为true,代表放弃了外键的维护权. 2.双方维护外键会多产生update语句,造成浪 ...