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)\] 左边一项直接求,右边可递归处理,不包 ...
随机推荐
- [CSS] vertical-align
原文地址: http://www.zhangxinxu.com/wordpress/2010/05/%E6%88%91%E5%AF%B9css-vertical-align%E7%9A%84%E4%B ...
- OpenGL的glClearColor和glClear改变背景颜色
OpenGL的glClearColor和glClear改变背景颜色 结合以下两个函数void glClearColor(GLclampf red, GLclampf green, GLclamp ...
- Hbase之原子性插入
/** * Created by similarface on 16/8/16. */ import java.io.IOException; import org.apache.hadoop.con ...
- windows多线程框架
#include <iostream> #include <windows.h> using namespace std; HANDLE hMutex; //public : ...
- 在应用中更新App版本
在应用中, 为了提高用户体验, 会提供更新版本的功能. 那么如何实现呢? 我写了一个简单的Demo, 说明一下, 需要注意几个细节. 使用了Retrofit和Rx处理网络请求. Github下载地址 ...
- CLGeocoder Error Domain=kCLErrorDomain Code=2
使用CLGeocoder解码地址时,遇到错误 Error Domain=kCLErrorDomain Code=2 代码: #pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定 ...
- linux redis 安装
linux下redis安装 我用的系统是:redhat [root@infa ~]# wget http://download.redis.io/releases/redis-2.8.12.tar ...
- 两端对齐(兼容较好,支持IE)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- kellogg项目总结
1.题目的去随机值去重 (当时做的是每次点击取出一个随机数,并删除数组中位置,后来改成获取10个随机数组成的数组,二者略有差距,修改颇长时间) function getArr(num){ totalA ...
- NetworkShareAccesser: 远程PC1 文件 copy 到PC2 文件夹
Usage: string strRepoBundlePath = @"\\at1-repo01\ATE\Bundles\SharePoint\Open\denyopen.zip" ...