Lucas定理小推论
随便记录点数论小trick
定理的小推论
先来看一道简单的例题:有趣的杨辉三角
题目大意:
给定一个整数 和一个质数 ,求出杨辉三角上第 行上有多少个数不能被 整除
分析
看到数据范围很恐怖,众所周知杨辉三角的第 行上一共有 个数,分别是:
的范围很大,而且要是暴力直接求组合数也得花费时间,显然不能直接暴力求解
但我们注意到 是个很小的质数,而且这题考虑的组合数都是在模 的意义下的,因此我们可以考虑 定理
题目要求这 个组合数当中不能被 整除的数有多少个,我们可以考虑一下怎么求可以被 整除的数有多少个,即存在多少个 有
回顾一下 定理:当 为质数时,将 与 写成 进制数:
则我们有:
那当什么情况下这个 呢?
我们将上面的式子分开来看,比如对于一个 而言,要让它为 ,根据组合数的求法,只有可能是 时才会出现这样的情况,所以只要 ,这个 在 的意义下都不为 ,即不被 整除。
那这样的 有多少个呢?根据乘法原理,将 进行 进制拆分后,对于 的 进制第 位来说, 的取值可以是 一共 种选法,所以最终答案为:
其实这是个比较出名的定理,如下图:觉得我写的烂的可以自行阅读一下文献
Code:
#include <iostream>
#include <cstdio>
using namespace std;
const int mod = 10000;
int main() {
int n, p, Case = 0;
while (cin >> p >> n, n || p) {
int res = 1;
while (n) {
res = res * (n % p + 1) % mod;
n /= p;
}
printf("Case %d: %04d\n", ++ Case, res);
}
return 0;
}
时间复杂度:对 进行 进制分解的复杂度为 ,乘上测试数据组数,总时间复杂度为 ,完全没问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)