博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【模板】卢卡斯定理
阅读量:4676 次
发布时间:2019-06-09

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

给定n,m,p(1≤n,m,p≤1051\le n,m,p\le 10^51n,m,p105)

Cn+mm mod pC_{n+m}^{m}\ mod\ pCn+mm mod p

保证P为prime

C表示组合数。

一个测试点内包含多组数据。

输入输出格式

输入格式:

第一行一个整数T(T≤10T\le 10T10),表示数据组数

第二行开始共T行,每行三个数n m p,意义如上

输出格式:

共T行,每行一个整数表示答案。

输入输出样例

输入样例#1:
21 2 52 1 5
输出样例#1:
33

思路

卢卡斯定理;

C(m,n)%p=C(m/p,n/p)*C(m%p,n%p)%p;

代码

1 #include
2 const int maxn=1e5+10; 3 int T,n,m,p; 4 int f[maxn]={
1}; 5 void init(){
for(int i=1;i<=p;i++) f[i]=(1ll*f[i-1]*i)%p;} 6 int FP(int x,int y){ 7 int ret=1; 8 while(y){ 9 if(y&1) ret=(1ll*ret*x)%p;10 y>>=1,x=(1ll*x*x)%p;11 }12 return ret;13 }14 int IE(int x){
return FP(x,p-2);}15 int C(int m,int n){16 if(m>n) return 0;17 return 1ll*f[n]*IE(f[n-m])%p*IE(f[m])%p;18 }19 int Lucas(int m,int n){20 if(!m) return 1;21 return 1ll*Lucas(m/p,n/p)*C(m%p,n%p)%p;22 }23 int main(){24 scanf("%d",&T);25 while(T--){26 scanf("%d%d%d",&n,&m,&p);27 init();28 printf("%d\n",Lucas(m,n+m)%p);29 }30 return 0;31 }

 

转载于:https://www.cnblogs.com/J-william/p/7732192.html

你可能感兴趣的文章
前端面试题
查看>>
Yii2之GridView部件
查看>>
Yii2 composer报错处理
查看>>
Yii 2.0 rules 验证规则大全
查看>>
yii2.0用户登录,退出判断
查看>>
Yii2 menu navbar nav小部件的使用示例
查看>>
Yii2 选择布局的方式
查看>>
关于Tfrecord
查看>>
时间序列分析
查看>>
sql语句_ 的三种去重方法
查看>>
BlockingQueue深入解析
查看>>
Push rejected: Push master to origin/master was rejected by remote(IDEA、MAC、GIT)
查看>>
最强整理Mac IDEA 常用快捷键
查看>>
LeetCode(Java版)因为用上了MD所有删掉了以前的帖子
查看>>
阻止冒泡(例:a标签上面绝对定位的文字标签【×】
查看>>
清除浮动的方法
查看>>
前言、Mysql简介
查看>>
第一次个人编程作业
查看>>
第一次博客作业
查看>>
第一次团队展示
查看>>