lucas定理解决大数组合问题
来源:互联网 发布:jquery如何遍历数组 编辑:程序博客网 时间:2024/05/13 21:40
数论Lucas定理是用来求 c(n,m) mod p的值,p是素数(从n取m组合,模上p)。
描述为:
Lucas(n,m,p)=cm(n%p,m%p)* Lucas(n/p,m/p,p)
Lucas(x,0,p)=1;
而
cm(a,b)=a! * (b!*(a-b)!)^(p-2) mod p
也= (a!/(a-b)!) * (b!)^(p-2)) mod p
这里,其实就是直接求 (a!/(a-b)!) / (b!) mod p
由于 (a/b) mod p = a * b^(p-2) mod p
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<set>
#include<vector>
#include<algorithm>
#define ll long long
using
namespace
std;
int
n,m;
const
int
p=10007;
int
qpow(
int
a,
int
b)
{
int
ans;
for
(ans=1;b;b>>=1,a=a*a%p)
if
(b&1)ans=ans*a%p;
return
ans;
}
int
getc
(
int
n,
int
m)
{
if
(n<m)
return
0;
if
(m>n-m)m=n-m;
ll s1=1,s2=1;
for
(
int
i=0;i<m;i++)
{
s1=s1*(n-i)%p;
s2=s2*(i+1)%p;
}
return
s1*qpow(s2,p-2)%p;
}
int
lucas(
int
n,
int
m)
{
if
(m==0)
return
1;
return
getc
(n%p,m%p)*lucas(n/p,m/p)%p;
}
int
main()
{
scanf
(
"%d%d"
,&n,&m);
printf
(
"%d\n"
,lucas(n,m));
return
0;
}
0 0
- lucas定理解决大数组合问题
- Lucas定理(大数组合数取模)
- lucas定理求大数组合数取模
- 组合取模问题与Lucas定理
- 【HDU 3037】大数组合取模之Lucas定理+扩展欧几里得求逆元与不定方程一类问题
- 【 Lucas定理 】 组合数取模
- FZUOJ2020 组合 (lucas定理)
- Lucas定理---组合数取模
- 组合数/Lucas定理
- lucas 定理,组合数取模
- 卢卡斯定理 解决大数组合数求余。
- HDU 3037 (大数&LUCAS定理)
- FZU 2020 组合 lucas定理
- Lucas定理 大组合数取模
- hdu3037 lucas 定理 组合数取模
- 组合数中的Lucas定理
- Lucas定理及组合数取模
- hdu3037 组合数 lucas定理
- Linux 下screen命令的使用
- nginx phases 介绍
- Java中Array与ArrayList的主要区别(
- IOS获取设备UUID的方法
- 编写一个函数计算机一个字符串的长度
- lucas定理解决大数组合问题
- [Java]反射机制
- java面试题总结(四)
- You Say You Want An Education?
- Hihocoder 第三十八周 二分答案
- 100小时学会SAP.Day1
- android中实现图片的放大与缩小
- android--文本点击的两种方法(十)
- iOS学习路线