lucas 定理学习
2015-09-10 00:52
435 查看
大致意思就是求组合数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 = 1; while(n){ ret = ret*((n&1)+1); n>>=1; } printf("%d\n",ret); } return 0; }
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 = 1; while(b){ if(b&1) ret = ret*a%p; a = (ll)a*a%p; b>>=1; } return ret; } int C(int a , int b , int p) { if(b==0) return 1; if(a<b) return 0; if(a==b) return 1; int s=1 , t=1; for(int i=1 ; i<=b ; i++) s=(ll)s*(a-i+1)%p; for(int i=1 ; i<=b ; i++) t=(ll)t*i%p; //cout<<"C: "<<a<<" "<<b<<" "<<p<<" "<<s<<" "<<t<<endl; return (ll)s*q_pow(t , p-2 , p)%p; } int lucas(int a, int b,int p) { //cout<<"in: "<<a<<" "<<b<<" "<<p<<endl; if(b==0) return 1; if(a<b) return 0; if(a==b) return 1; //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 0; }
相关文章推荐
- CD4541B定时器的使用方法
- Uva-12118 Inspector's Dilemma
- oracle:通过触发器实现对数据库对象增删改动作的审计
- 多线程的实现方式和安全性
- 创建本地SVN版本库以及将SVN导入GIT
- fuckou
- MOBA游戏草丛系统的个人思路
- java 断言
- ZOJ 3213 Beautiful Meadow(插头DP)
- 使用编译原理,把逻辑编排交给策划
- 广州实时公交查询系统调研
- AWS ECS 的auto scaling
- libevent使用点滴(3)关于定时器
- 【邂逅BUG】Namespace declaration statement has to be the very first statement in the script
- 在Windows 上配置 php和mongodb 数据库
- USACO 1.4 Arithmetic Progressions
- mapreduce任务中数据分布倾斜导致reduce负载不均衡的解决方案
- DontDestroyOnLoad带来的麻烦
- <转> Android LayoutInflater详解
- 黑马程序员 什么是内部类