博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lucas定理
阅读量:6602 次
发布时间:2019-06-24

本文共 2009 字,大约阅读时间需要 6 分钟。

Lucas定理:

A,B是非负数,p是质数,

A可以写成p进制a[n]....a[0],B可以写成p进制b[n]......b[0]

则组合数C(a,b) = C(a[n],b[n])*.....*C(a[0],b[0])

我们借此实现组合数取模,Lucas(a,b,p) = C(a%p,b%p)*Lucas(a/p,b/p,p);

对于C(a,b) = a!/(b!*(a-b)!),

对此我们可以利用费马小定理,a^(p-1) = 1(mod p) ->a*a^(p-2) = 1

所以1/(b!*(a-b)!) = (b!*(a-b)!)^(p-2)

参考:

hdu 3037

求C(n+m,m)%p,模板题

 

#include 
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef long double ld;const ld eps=1e-10;const int inf = 0x3f3f3f;const int maxn = 100005;ll fac[maxn];ll pow_mod(ll a,ll b,ll mod){ ll ret = 1; while(b) { if(b & 1) ret = (ret*a)%mod; a = (a*a)%mod; b >>= 1; } return ret;}ll Fac(ll p){ fac[0] = 1; for(int i = 1;i <= p;i++) { fac[i] = (fac[i-1] * i)%p; }}ll lucas(ll n,ll m,ll p){ ll ret = 1; while(n && m) { ll a = n % p; ll b = m % p; if(a < b) return 0; ret = (ret*fac[a]*pow_mod(fac[b]*fac[a-b]%p,p-2,p))%p; n /= p; m /= p; } return ret%p;}int main(){ int t; scanf("%d",&t); while(t--) { ll a,b,p; scanf("%I64d%I64d%I64d",&a,&b,&p); Fac(p); ll ans = lucas(a+b,b,p); printf("%I64d\n",ans); }}

  

hdu 4349

lucas定理的拓展

直接用lucas超时- -

对于每个C(n,0)....C(n,n),利用lucas定理把它们看成二进制数,于是根据分解公式我们可以看成C(a[n],b[n])*.....*C(a[0],b[0]),

可以发现C(1,1) = C(1,0) = C(0,0) = 1; C(0,1) = 0;所以当a中为0的位置b也为0时我们才可能得到1,

于是成了统计a中1的个数num。然后2^num得出b可能有多少种即可

例:

C(21,20)  10100  10101

C(1,1)*C(0,0)*C(1,1)*C(0,0)*C(1,0) = 1.

C(21,18)

10010  10101

C(1,1)*C(0,0)*C(1,0)*C(0,1)*C(1,0) = 0.

 

#include 
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef long double ld;const ld eps=1e-10;const int inf = 0x3f3f3f;const int maxn = 100005;int main(){ ll x; while(scanf("%I64d",&x) != EOF) { ll num = 0; while(x) { if(x & 1) num++; x >>= 1; } printf("%I64d\n",(ll)1<

  

转载于:https://www.cnblogs.com/Przz/p/5409657.html

你可能感兴趣的文章
安卓-PC-Arduino3方通信实现
查看>>
ASP.NET MVC5+EF6+EasyUI 后台管理系统(7)-MVC与EasyUI DataGrid
查看>>
Android下的Junit测试
查看>>
swift3.0:sqlite3的使用
查看>>
[Git] Git把Tag推送到远程仓库
查看>>
【字符串处理算法】字符串包含的算法设计及C代码实现【转】
查看>>
【目录】开源Math.NET基础数学类库使用总目录
查看>>
Angular遇上CoffeeScript - NgComponent封装
查看>>
C++重要知识点小结---1
查看>>
[游戏模版1] MFC最小框架(base function including)
查看>>
javax.validation.ValidationException: Unable to create a Configuration
查看>>
word排版汇总
查看>>
【web JSP basePath】basePath的含义
查看>>
dos命令批处理发送文字到剪贴板
查看>>
Elasticsearch增删改查 之 —— Delete删除
查看>>
OK335xS 256M 512M nand flash make ubifs hacking
查看>>
Point Grey articles link
查看>>
三步走——带你打造一份完美的数据科学家简历
查看>>
shell的历史
查看>>
5.12. zip
查看>>