当前位置: 首页 > news >正文

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} 1T1051n,k1018

分析:
       看到 模数是质数 并且组合数的上下标都很大,可以想到 Lucas 定理。我们根据取模后的到的余数对这 k k k 个位置进行分类,然后计算贡献。

       当 k ≥ m o d k \geq mod kmod 时:
       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=0mod1i=0modk+11Cnu+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=0mod1Cnu×i=0modk+11Cmodni+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 edst+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=0modk+11Cmodni 又转化成了一个子问题。并且上下界都会除以 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=0kCnik<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,edst+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 Cij0ji<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,edst+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=0edstCni,然后再乘上 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定理

题面&#xff1a; 题目 题意概括&#xff1a; T T T 次询问&#xff0c;每次给出 n , k n,k n,k&#xff0c;求 ∑ i 0 k C n i % 2333 \sum_{i 0}^{k} C_{n}^{i} \ \% \ 2333 ∑i0k​Cni​ % 2333。 1 ≤ T ≤ 1 0 5 &#xff0c; 1 ≤ n , k ≤ 1 0 18 1\leq T \leq10^5…...

http代理和ip代理的区别,代理IP带来了哪些好处?

随着互联网的快速发展&#xff0c;代理IP和HTTP代理已成为网络爬虫、网络营销、数据抓取等领域中不可或缺的一部分。但是&#xff0c;很多人在使用代理IP和HTTP代理时并不清楚两者的区别&#xff0c;以及代理IP所带来的好处。本文将详细介绍这两者之间的差异&#xff0c;以及代…...

浅谈电动汽车充电桩检测技术的实现

叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a; 关键词&#xff1a;电动直流和交流充电桩是我国电动汽车充电桩中运行量较大的一种。为了保持正常运行和使用&#xff0c;应高度重视检测、运行和维护工作。因此&#xff0c;有关部门应做好充电桩的检测工作…...

20 分钟搭建一个串流服务器

步骤1&#xff1a;准备Nginx RTMP容器 首先&#xff0c;您可以使用官方的Nginx RTMP Docker镜像来创建Nginx RTMP容器。运行以下命令&#xff1a; docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmp 这将在后台运行Nginx RTMP容器&#xff0c;将本地1935端…...

Android ActivityLifecycleCallback使用

在 Android 开发中&#xff0c;ActivityLifecycleCallbacks 是一个接口&#xff0c;用于监听和管理应用程序中 Activity 的生命周期事件。通过实现 ActivityLifecycleCallbacks 接口&#xff0c;可以在 Activity 的创建、启动、暂停、恢复、停止和销毁等各个阶段执行相应的操作…...

力扣labuladong——一刷day14

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣21. 合并两个有序链表二、力扣86. 分隔链表三、力扣23. 合并 K 个升序链表四、力扣19. 删除链表的倒数第 N 个结点五、力扣876. 链表的中间结点六、力扣…...

循环神经网络(RNN)与长短期记忆网络(LSTM)

前言&#xff1a; 通过前面的学习&#xff0c;我们以BP神经网络为基础&#xff0c;认识到了损失函数&#xff0c;激活函数&#xff0c;以及梯度下降法的原理&#xff1b;而后学习了卷积神经网络&#xff0c;知道图像识别是如何实现的。今天这篇文章&#xff0c;讲述的就是计算机…...

ArxDbgDocLockWrite 类简介

ArxDbgDocLockWrite 类是一个用于在 AutoCAD 中锁定文档的自定义类。它提供了一些方法来获取和释放对文档的写入锁定&#xff0c;并且还可以设置当前文档。 该类的原理如下&#xff1a; 构造函数 ArxDbgDocLockWrite() 和 ArxDbgDocLockWrite(AcDbDatabase* db) 用于创建 Arx…...

【教3妹学编辑-算法题】环和杆

3妹&#xff1a;2哥&#xff0c;今年春节的放假安排出来了&#xff0c;今年春节放8天假&#xff0c;我们公司除夕提前放一天&#xff0c;总共9天假。 耶~~~ 2哥 :你们公司这么好啊&#xff0c; 我们公司的放假安排还没出来&#xff0c;不知道今年除夕能不能回家了… 3妹&#x…...

解决 eslint 的 Parsing error: Unexpected token 错误

解决 eslint 的 Parsing error: Unexpected token 错误 问题描述&#xff1a;import动态导入&#xff0c;将js文件单独打包时&#xff0c;webpack打包错误 ERROR in ./src/js/main.js Module Error (from ./node_modules/_eslint-loader4.0.2eslint-loader/dist/cjs.js ): F…...

VR全景技术在文化展示与传播中有哪些应用?

引言&#xff1a; 随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术已经成为文化展示与传播领域的一项重要工具。那么VR全景技术是如何改变文化展示与传播方式&#xff0c;VR全景技术又如何推动文化的传承和普及呢&#xff1f; 一&#xff0e;VR技术…...

Linux shell编程学习笔记19:until循环语句

Linux shell编程中的until语句&#xff0c;在功能上与其它编程语言一致&#xff0c;但在结构与其它编程语言又不太一样。在大多数编程语言中&#xff0c;until语句的循环条件表达式一般位于循环体语句的后面&#xff0c;但是在Linux shell编程中&#xff0c;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博客...

恶意软件防范和拦截: 提供防范恶意软件攻击的策略

恶意软件&#xff0c;或者俗称的“病毒”&#xff0c;一直是IT领域的一个严重威胁。这些恶意软件可以窃取敏感信息、损害系统稳定性&#xff0c;甚至对企业和个人造成重大经济损失。在这篇博客文章中&#xff0c;我们将讨论如何防范和拦截恶意软件攻击&#xff0c;包括使用反病…...

单例模式浅析

程序中仅存在一个对象实例&#xff0c;避免重复构建浪费资源。 1.饿汉式 主要分为3步&#xff1a;1.构造方法私有化 2.内部创建静态实例化对象 3.提供公有静态方法&#xff0c;返回对象实例 public class SingleTon { // 构造方法私有化private SingleTon(){} // 内部…...

Springboot引入mybatis-plus及操作mysql的json字段

springboot引入mybatis-plus&#xff0c;创建springboot项目省略 pom文件 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version></dependency> <!…...

springboot读取application.properties中文乱码问题

目录 1 前言&#xff1a; 2 本地环境中的解决方案&#xff08;以idea为例&#xff09; 3 全部解决方案 1 前言&#xff1a; 初用properties,读取java properties文件的时候如果value是中文&#xff0c;会出现乱码的问题。我们首先需要明了乱码问题的根源。在 Java 中&#x…...

SAML- 安全断言标记语言

一、概念 安全断言标记语言&#xff08;SAML&#xff09;是一种开放标准&#xff0c;用于在各方之间&#xff08;特别是身份提供商和服务提供商之间&#xff09;交换身份验证和授权数据。SAML 是一种基于XML的安全断言标记语言&#xff08;服务提供商用来做出访问控制决策的语句…...

【佳学基因检测】Node.js中http模块的使用

【佳学基因检测】Node.js中http模块的使用 先看代码&#xff1a; http.createServer(function (req, res) {res.writeHead(200, {Content-Type: text/html});res.end(测基因&#xff0c;阻遗传&#xff0c;就在佳学基因干&#xff08;http://www.jiaxujiyin.com)!); }).liste…...

前端基础之JavaScript

JavaScript是一种能够在网页上添加交互效果的脚本语言&#xff0c;也被称为客户端语言。它可以在网页中操作HTML元素、改变CSS样式&#xff0c;以及处理用户的交互事件等。 以下是JavaScript的常见基础知识点&#xff1a; 变量和数据类型&#xff1a;JavaScript中的变量可以存…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...