P4345 [SHOI2015] 超能粒子炮·改 题解---------Lucas定理
题面:
题目
题意概括: T T T 次询问,每次给出 n , k n,k n,k,求 ∑ i = 0 k C n i % 2333 \sum_{i = 0}^{k} C_{n}^{i} \ \% \ 2333 ∑i=0kCni % 2333。 1 ≤ T ≤ 1 0 5 , 1 ≤ n , k ≤ 1 0 18 1\leq T \leq10^5,1\leq n,k \leq 10^{18} 1≤T≤105,1≤n,k≤1018。
分析:
看到 模数是质数 并且组合数的上下标都很大,可以想到 Lucas 定理。我们根据取模后的到的余数对这 k k k 个位置进行分类,然后计算贡献。
当 k ≥ m o d k \geq mod k≥mod 时:
r e s = ∑ u = 0 m o d − 1 ∑ i = 0 ⌊ k + 1 m o d ⌋ − 1 C n u + i × m o d + g e t ( n , ⌊ k + 1 m o d ⌋ , ⌊ k + 1 m o d ⌋ × m o d , k ) \Large res = \sum_{u=0}^{mod-1}\sum_{i = 0}^{\left \lfloor \frac{k + 1}{mod} \right \rfloor - 1} C_{n}^{u + i\times mod} + get(n,\left \lfloor \frac{k + 1}{mod} \right \rfloor , \left \lfloor \frac{k + 1}{mod} \right \rfloor \times mod, k) res=∑u=0mod−1∑i=0⌊modk+1⌋−1Cnu+i×mod+get(n,⌊modk+1⌋,⌊modk+1⌋×mod,k)
= ∑ u = 0 m o d − 1 C n u × ∑ i = 0 ⌊ k + 1 m o d ⌋ − 1 C n m o d i + g e t ( n , ⌊ k + 1 m o d ⌋ , ⌊ k + 1 m o d ⌋ × m o d , k ) \Large \;\;\;\;\;\;=\sum_{u=0}^{mod-1}C_{n}^{u} \times \sum_{i = 0}^{\left \lfloor \frac{k + 1}{mod} \right \rfloor - 1}C_{\frac{n}{mod}}^{i} + get(n,\left \lfloor \frac{k + 1}{mod} \right \rfloor , \left \lfloor \frac{k + 1}{mod} \right \rfloor \times mod, k) =∑u=0mod−1Cnu×∑i=0⌊modk+1⌋−1Cmodni+get(n,⌊modk+1⌋,⌊modk+1⌋×mod,k)
其中 g e t ( n , c n t , s t , e d ) = ∑ i = s t e d C n i get(n, cnt, st, ed) = \sum_{i = st}^{ed} C_{n}^{i} get(n,cnt,st,ed)=∑i=stedCni。 e d − s t + 1 < m o d ed - st + 1< mod ed−st+1<mod。 c n t cnt cnt 是为了方便计算传上去的。
我们发现,计算 ∑ i = 0 ⌊ k + 1 m o d ⌋ − 1 C n m o d i \Large \sum_{i = 0}^{\left \lfloor \frac{k + 1}{mod} \right \rfloor - 1}C_{\frac{n}{mod}}^{i} ∑i=0⌊modk+1⌋−1Cmodni 又转化成了一个子问题。并且上下界都会除以 m o d mod mod,所以减小的会很快。
当 k < m o d k < mod k<mod 时:
r e s = ∑ i = 0 k C n i \Large res = \sum_{i = 0}^{k} C_{n}^{i} res=∑i=0kCni。
如果按照上面的式子去做,那么时间复杂度是 O ( T × m o d ) O(T \times mod) O(T×mod) 的。
因为 O ( T × m o d ) O(T \times mod) O(T×mod) 是过不去的。 瓶颈在于第一种情况中枚举 u u u 和计算 g e t get get 函数,以及第二种情况中枚举 i i i。它们的复杂度是 O ( m o d ) O(mod) O(mod) 的。我们考虑优化。
现在问题转变成了如何快速的求出 ∑ i = 0 k C n i , k < m o d \Large \sum_{i = 0}^{k} C_{n}^{i},k < mod ∑i=0kCni,k<mod 以及 快速求出 ∑ i = s t e d C n i , e d − s t + 1 < m o d \Large \sum_{i = st}^{ed} C_{n}^{i}, ed -st + 1 < mod ∑i=stedCni,ed−st+1<mod。
1.
对于 ∑ i = 0 k C n i \Large \sum_{i = 0}^{k} C_{n}^{i} ∑i=0kCni
我们考虑用 L u c a s Lucas Lucas 计算的时候, C n i = C n % m o d i % m o d × C n m o d i m o d \Large C_{n}^{i} = C_{n \%mod}^{i\%mod} \times C_{\frac{n}{mod}}^{\frac{i}{mod}} Cni=Cn%modi%mod×Cmodnmodi。
因为 i < m o d i < mod i<mod,所以 C n i = C n % m o d i × C n m o d 0 = C n % m o d i \Large C_{n}^{i} = C_{n \% mod}^{i} \times C_{\frac{n}{mod}}^{0} = C_{n \% mod}^{i} Cni=Cn%modi×Cmodn0=Cn%modi。
我们直接预处理出来 C i j , 0 ≤ j ≤ i < m o d \Large C_{i}^{j}, 0 \leq j \leq i < mod Cij,0≤j≤i<mod,以及 S i j = ∑ k = 0 j C i k \Large S_{i}^{j} = \sum_{k = 0}^{j} C_{i}^{k} Sij=∑k=0jCik。
那么 ∑ i = 0 k C n i = S n % m o d m i n ( k , n % m o d ) \Large \sum_{i = 0}^{k} C_{n}^{i} = S_{n \% mod}^{min(k, n \% mod)} ∑i=0kCni=Sn%modmin(k,n%mod), O ( 1 ) O(1) O(1) 调用就可以。
2.
对于 ∑ i = s t e d C n i , e d − s t + 1 < m o d \Large \sum_{i = st}^{ed} C_{n}^{i}, ed -st + 1 < mod ∑i=stedCni,ed−st+1<mod。
我们考虑此时 s t st st 一定是 m o d mod mod 的倍数,因为 s t st st 到 e d ed ed 是长度不到 m o d mod mod 的剩余那段。
有一个性质是 若 i , j < m o d i, j < mod i,j<mod, C n i + k × m o d \Large C_{n}^{i + k \times mod} Cni+k×mod 与 C n i \Large C_{n}^{i} Cni 的比值 和 C n j + k × m o d \Large C_{n}^{j + k \times mod} Cnj+k×mod与 C n j \Large C_{n}^{j} Cnj 的比值相同。 并且这个比值是 C n / m o d k \Large C_{n / mod}^{k} Cn/modk。这个可以用 Lucas 轻松证明。
那么问题就很简单了,我们求出 ∑ i = 0 e d − s t C n i \Large \sum_{i=0}^{ed-st}C_{n}^{i} ∑i=0ed−stCni,然后再乘上 C n / m o d k \Large C_{n/mod}^{k} Cn/modk 就好了。前面那个东西就是我们上面讨论的,后面那个可以用 L u c a s Lucas Lucas 定理在 l o g 2 n log_2n log2n 的时间复杂度内求出。
然后这道题就做完了,时间复杂度是 O ( T × l o g 2 n ) O(T \times log_2n) O(T×log2n)。
#include<bits/stdc++.h>// 找规律 好题啊
using namespace std;
typedef long long LL;
const LL mod = 2333;
int T;
LL n, k, inv[mod + 10], fac[mod + 10], c[mod + 10][mod + 10];
LL sum[mod + 10][mod + 10];
LL C(int n, int m){if(n < m) return 0;else return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
LL Pow(LL x, LL y){LL res = 1, k = x % mod;while(y){if(y & 1) res = (res * k) % mod;y >>= 1;k = (k * k) % mod;}return res % mod;
}
LL Lucas(LL n, LL m){if(n < mod && m < mod) return C(n, m);else return C(n % mod, m % mod) * Lucas(n / mod, m / mod) % mod;
}
LL get(LL n, LL k, LL st, LL ed){if(st > ed) return 0;else{LL tmp = Lucas(n / mod, k);return tmp * sum[n % mod][min(ed - st, n % mod)] % mod;}
}
LL calc(LL n, LL k){// calc(n, k) = Σc[n][0] + c[n][1] + ... + c[n][k] k = min(k, n);// 取小的if(k < mod) return sum[n % mod][min(k, n % mod)];// k < mod 根据Lucas定理可知道, c[n][i] = c[n % mod][i % mod] * c[n / mod][i / mod] = c[n % mod][i] * c[n / mod][0] = c[n % mod][i] else return (sum[n % mod][n % mod] * calc(n / mod, (k + 1) / mod - 1LL) % mod + get(n, (k + 1) / mod, (k + 1) / mod * mod, k)) % mod;
}
int main(){fac[0] = 1LL;for(int i = 1; i < mod; i++) fac[i] = fac[i - 1] * (1LL * i) % mod;inv[mod - 1] = Pow(fac[mod - 1], mod - 2) % mod;for(int i = mod - 2; i >= 0; i--) inv[i] = inv[i + 1] * (1LL * (i + 1)) % mod;for(int i = 0; i <= mod - 1; i++){for(int j = 0; j <= i; j++){c[i][j] = C(i, j);if(!j) sum[i][j] = c[i][j] % mod;else sum[i][j] = (sum[i][j - 1] + c[i][j]) % mod;}}scanf("%d", &T);while(T--){scanf("%lld%lld", &n, &k);k = min(k, n);if(n < mod) printf("%lld\n", sum[n][k]);else{// n >= modprintf("%lld\n", calc(n, k));}}return 0;
}
相关文章:
P4345 [SHOI2015] 超能粒子炮·改 题解---------Lucas定理
题面: 题目 题意概括: T T T 次询问,每次给出 n , k n,k n,k,求 ∑ i 0 k C n i % 2333 \sum_{i 0}^{k} C_{n}^{i} \ \% \ 2333 ∑i0kCni % 2333。 1 ≤ T ≤ 1 0 5 , 1 ≤ n , k ≤ 1 0 18 1\leq T \leq10^5…...
http代理和ip代理的区别,代理IP带来了哪些好处?
随着互联网的快速发展,代理IP和HTTP代理已成为网络爬虫、网络营销、数据抓取等领域中不可或缺的一部分。但是,很多人在使用代理IP和HTTP代理时并不清楚两者的区别,以及代理IP所带来的好处。本文将详细介绍这两者之间的差异,以及代…...
浅谈电动汽车充电桩检测技术的实现
叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要: 关键词:电动直流和交流充电桩是我国电动汽车充电桩中运行量较大的一种。为了保持正常运行和使用,应高度重视检测、运行和维护工作。因此,有关部门应做好充电桩的检测工作…...
20 分钟搭建一个串流服务器
步骤1:准备Nginx RTMP容器 首先,您可以使用官方的Nginx RTMP Docker镜像来创建Nginx RTMP容器。运行以下命令: docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmp 这将在后台运行Nginx RTMP容器,将本地1935端…...
Android ActivityLifecycleCallback使用
在 Android 开发中,ActivityLifecycleCallbacks 是一个接口,用于监听和管理应用程序中 Activity 的生命周期事件。通过实现 ActivityLifecycleCallbacks 接口,可以在 Activity 的创建、启动、暂停、恢复、停止和销毁等各个阶段执行相应的操作…...
力扣labuladong——一刷day14
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣21. 合并两个有序链表二、力扣86. 分隔链表三、力扣23. 合并 K 个升序链表四、力扣19. 删除链表的倒数第 N 个结点五、力扣876. 链表的中间结点六、力扣…...
循环神经网络(RNN)与长短期记忆网络(LSTM)
前言: 通过前面的学习,我们以BP神经网络为基础,认识到了损失函数,激活函数,以及梯度下降法的原理;而后学习了卷积神经网络,知道图像识别是如何实现的。今天这篇文章,讲述的就是计算机…...
ArxDbgDocLockWrite 类简介
ArxDbgDocLockWrite 类是一个用于在 AutoCAD 中锁定文档的自定义类。它提供了一些方法来获取和释放对文档的写入锁定,并且还可以设置当前文档。 该类的原理如下: 构造函数 ArxDbgDocLockWrite() 和 ArxDbgDocLockWrite(AcDbDatabase* db) 用于创建 Arx…...
【教3妹学编辑-算法题】环和杆
3妹:2哥,今年春节的放假安排出来了,今年春节放8天假,我们公司除夕提前放一天,总共9天假。 耶~~~ 2哥 :你们公司这么好啊, 我们公司的放假安排还没出来,不知道今年除夕能不能回家了… 3妹&#x…...
解决 eslint 的 Parsing error: Unexpected token 错误
解决 eslint 的 Parsing error: Unexpected token 错误 问题描述:import动态导入,将js文件单独打包时,webpack打包错误 ERROR in ./src/js/main.js Module Error (from ./node_modules/_eslint-loader4.0.2eslint-loader/dist/cjs.js ): F…...
VR全景技术在文化展示与传播中有哪些应用?
引言: 随着科技的不断进步,虚拟现实(VR)全景技术已经成为文化展示与传播领域的一项重要工具。那么VR全景技术是如何改变文化展示与传播方式,VR全景技术又如何推动文化的传承和普及呢? 一.VR技术…...
Linux shell编程学习笔记19:until循环语句
Linux shell编程中的until语句,在功能上与其它编程语言一致,但在结构与其它编程语言又不太一样。在大多数编程语言中,until语句的循环条件表达式一般位于循环体语句的后面,但是在Linux shell编程中,until语句的循环条件…...
(CV)论文列表
CNN卷积神经网络之SKNet及代码 https://blog.csdn.net/qq_41917697/article/details/122791002 【CVPR2022 oral】MixFormer: Mixing Features across Windows and Dimensions 【精选】【CVPR2022 oral】MixFormer: Mixing Features across Windows and Dimensions-CSDN博客...
恶意软件防范和拦截: 提供防范恶意软件攻击的策略
恶意软件,或者俗称的“病毒”,一直是IT领域的一个严重威胁。这些恶意软件可以窃取敏感信息、损害系统稳定性,甚至对企业和个人造成重大经济损失。在这篇博客文章中,我们将讨论如何防范和拦截恶意软件攻击,包括使用反病…...
单例模式浅析
程序中仅存在一个对象实例,避免重复构建浪费资源。 1.饿汉式 主要分为3步:1.构造方法私有化 2.内部创建静态实例化对象 3.提供公有静态方法,返回对象实例 public class SingleTon { // 构造方法私有化private SingleTon(){} // 内部…...
Springboot引入mybatis-plus及操作mysql的json字段
springboot引入mybatis-plus,创建springboot项目省略 pom文件 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version></dependency> <!…...
springboot读取application.properties中文乱码问题
目录 1 前言: 2 本地环境中的解决方案(以idea为例) 3 全部解决方案 1 前言: 初用properties,读取java properties文件的时候如果value是中文,会出现乱码的问题。我们首先需要明了乱码问题的根源。在 Java 中&#x…...
SAML- 安全断言标记语言
一、概念 安全断言标记语言(SAML)是一种开放标准,用于在各方之间(特别是身份提供商和服务提供商之间)交换身份验证和授权数据。SAML 是一种基于XML的安全断言标记语言(服务提供商用来做出访问控制决策的语句…...
【佳学基因检测】Node.js中http模块的使用
【佳学基因检测】Node.js中http模块的使用 先看代码: http.createServer(function (req, res) {res.writeHead(200, {Content-Type: text/html});res.end(测基因,阻遗传,就在佳学基因干(http://www.jiaxujiyin.com)!); }).liste…...
前端基础之JavaScript
JavaScript是一种能够在网页上添加交互效果的脚本语言,也被称为客户端语言。它可以在网页中操作HTML元素、改变CSS样式,以及处理用户的交互事件等。 以下是JavaScript的常见基础知识点: 变量和数据类型:JavaScript中的变量可以存…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
