lucas 定理学习
大致意思就是求组合数C(n , m) % p的值, p为一个偶数
可以将组合数的n 和 m都理解为 p 进制的表示
n = ak*p^k + a(k-1)*p^(k-1) + ... + a1*p + a0
m = bk*p^k + b(k-1)*p^(k-1) + ... + b1*p + b0
然后C(n,m)%p = C(ak , bk) * C(a(k-1) , b(k-1)) * ... * C(a1 , b1) * C(a0 , b0) % p
当然这其中出现 ai < bi的情况那直接视为乘以了 0
其他情况都是正常的组合数计算
因为p为素数,取模的过程求逆元就是利用欧拉定理来求解
a^(-1) = a^(p-2) (mod p)
那么只要快速幂求a^(p-2) % p的值就行了 , 那么组合数C(ai , bi) 就可以算出来了
HDU 4349 求C(n , i)中 0<=i<=n 中多少个可以使C(n , i)为奇数
这里先将n转化为二进制表示,因为C(n,m)%p = C(ak , bk) * C(a(k-1) , b(k-1)) * ... * C(a1 , b1) * C(a0 , b0) % p
那么只会出现ai = 0 , 1 bi = 0 , 1的情况
那么只有ai=0 , bi = 1 才是C(ai , bi) = 0为偶数,其他时候都是奇数,那只要枚举每一位保证那一位出现的数字可能不超过n对应的二进制位即可
#include <bits/stdc++.h>
using namespace std; int main() {
int n;
while(~scanf("%d" , &n)){
int ret = ;
while(n){
ret = ret*((n&)+);
n>>=;
}
printf("%d\n",ret);
}
return ;
}
HDU 3037 一道比较裸的lucas定理的题目
求C(n+m , n)%p的值
#include <bits/stdc++.h>
using namespace std;
#define ll long long int q_pow(int a , int b , int p)
{
ll ret = ;
while(b){
if(b&) ret = ret*a%p;
a = (ll)a*a%p;
b>>=;
}
return ret;
} int C(int a , int b , int p)
{
if(b==) return ;
if(a<b) return ;
if(a==b) return ;
int s= , t=;
for(int i= ; i<=b ; i++) s=(ll)s*(a-i+)%p;
for(int i= ; i<=b ; i++) t=(ll)t*i%p;
//cout<<"C: "<<a<<" "<<b<<" "<<p<<" "<<s<<" "<<t<<endl;
return (ll)s*q_pow(t , p- , p)%p;
} int lucas(int a, int b,int p)
{
//cout<<"in: "<<a<<" "<<b<<" "<<p<<endl;
if(b==) return ;
if(a<b) return ;
if(a==b) return ;
//cout<<"en: "<<C(a%p , b%p , p)<<endl;
return (ll)C(a%p , b%p , p)*lucas(a/p , b/p , p)%p;
} int main() {
//freopen("in.txt" , "r" , stdin);
int n;
scanf("%d" , &n);
while(n--){
int a , b , p;
scanf("%d%d%d", &a , &b , &p);
printf("%d\n" , lucas(a+b,a,p));
}
return ;
}
lucas 定理学习的更多相关文章
- Lucas定理学习小记
(1)Lucas定理:p为素数,则有: (2)证明: n=(ak...a2,a1,a0)p = (ak...a2,a1)p*p + a0 = [n/p]*p+a0,m=[m/p]*p+b0其次,我们 ...
- Lucas定理学习(进阶中)
(1)Lucas定理:p为素数,则有: (2)证明: n=(ak...a2,a1,a0)p = (ak...a2,a1)p*p + a0 = [n/p]*p+a0,m=[m/p]*p+b0其次,我们 ...
- Lucas定理学习笔记
从这里开始 一个有趣的问题 扩展Lucas算法 一个有趣的问题 题目大意 给定$n, m, p$,求$C_{n}^{m}$除以$p$后的余数. Subtask#1 $0\leqslant m\leq ...
- lucas定理学习
Lucas定理是用来求 c(n,m) mod p,p为素数的值. 表达式: C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p 当我们遇到求一个N,M很大的组合数的时候,递推法就显得很耗 ...
- Lucas定理学习笔记(没有ex_lucas)
题目链接\(Click\) \(Here\) \(ex\_lucas\)实在是不能学的东西...简单学了一下\(Lucas\)然后打算就这样鸽着了\(QwQ\)(奶一口不可能考) 没什么复杂的,证明的 ...
- [Lucas定理]【学习笔记】
Lucas定理 [原文]2017-02-14 [update]2017-03-28 Lucas定理 计算组合数取模,适用于n很大p较小的时候,可以将计算简化到小于p $ \binom{n}{m} \m ...
- [学习笔记]扩展LUCAS定理
可以先做这个题[SDOI2010]古代猪文 此算法和LUCAS定理没有半毛钱关系. [模板]扩展卢卡斯 不保证P是质数. $C_n^m=\frac{n!}{m!(n-m)!}$ 麻烦的是分母. 如果互 ...
- 【转】Lucas定理 & 逆元学习小结
(From:离殇灬孤狼) 这个Lucas定理是解决组合数的时候用的,当然是比较大的组合数了.比如C(1000000,50000)% mod,这个mod肯定是要取的,要不算出来真的是天文数字了. 对于一 ...
- lucas定理 +证明 学习笔记
lucas定理 p为素数 \[\dbinom n m\equiv\dbinom {n\%p} {m\%p} \dbinom {n/p}{m/p}(mod p)\] 左边一项直接求,右边可递归处理,不包 ...
随机推荐
- C++——使用类
一.运算符重载 1.运算符重载 C++允许将运算符重载扩展到用户定义的类型. 要重载运算符,需使用被称为运算符函数的特殊函数形式.运算符函数的格式如下: operatorop(argument lis ...
- go框架
beego 的 http server… Author 逆雪寒 2015.12.02 原文地址 https://github.com/nixuehan/beego_you_know/blob/mast ...
- eclipse如何调试(Debug)程序(zhuan)
http://jingyan.baidu.com/article/e6c8503c7e46b6e54f1a18c5.html ************************************* ...
- 坑爹的对GBK编码的字符进行url编码
url编码又叫百分号编码 现在的url编码十分混乱,都没有按照新标准来 对汉字都按照不同的编码后再进行url编码 2005年1月发布的RFC 3986,强制所有新的URI必须对未保留字符不加以百分号编 ...
- sublime text修改TAB缩进为2个空格
打开sublime后在倒数第二项 preference---->Settings-user: 然后输入 "tab_size": 2, "translate_tabs ...
- HDUOJ---1236 排名(浙大考研题)
排名 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- webBrowser1执行函数
IHTMLWindow2 Win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;string s = "alert('x');& ...
- 数据类型转换的三种方式 Convert,parse和TryParse的解析
以Int类型为例,具体说明Convert.ToInt32(object value),int.Parse(object value)和int.TryParse(string s,out int res ...
- 20145236 《Java程序设计》实验五实验报告
20145236 实验五 Java网络编程 实验内容 1.运行TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TC ...
- Java DSL简介(收集整理)
一.领域特定语言(DSL) 领域特定语言(DSL)通常被定义为一种特别针对某类特殊问题的计算机语言,它不打算解决其领域外的问题.对于DSL的正式研究已经持续很多年,直 到最近,在程序员试图采用最易读并 ...