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

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

Lucas定理

  Lucas(n,m,p)=c(n%p,m%p)* Lucas(n/p,m/p,p),其中lucas(n,m,p)=C(n,m)%p

  (这里的除号是整除)

证明——百度百科

 

题意:求n个数的和<=m的方案数

题解:

  求a1+a2+ ... +an=m方案数, 利用隔板法要使得每个数>=1,所以令bi = ai+1>=1 则 b1+b2+ ... +bn=m+n方案数为C(m+n-1, n-1)=C(m+n-1, m)

  故 ans = sigama(C(i+n-1, i)) = C(n-1, 0) + C(n, 1) + C(n+1, 2) + ... + C(n+m-1, m) = C(n+m, m)

  剩下的就是Lucas定理的应用了。

 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)>(y)?(y):(x))#define INF 0x3f3f3f3fusing namespace std;long long fac[100005];long long quick(long long a, long long n, long long p){ long long tmp=a%p, ret=1; while(n) { if(n&1) ret=(ret*tmp)%p; tmp=(tmp*tmp)%p; n>>=1; } return ret%p;}long long C(long long n, long long m, long long p){ if(m>n) return 0; fac[0]=1; for(int i=1; i<=n; i++) fac[i]=(fac[i-1]*i)%p; return (fac[n]*quick(fac[m]*fac[n-m], p-2, p))%p;}long long Lucas(long long n, long long m, long long p){ long long ret=1; while(n && m) { ret=ret*C(n%p, m%p, p)%p;//注意 C(10, 8) % 9这类情况 n/=p; m/=p; } return ret;}long long n,m,p;int main(){ int t; scanf("%d", &t); while(t--) { scanf("%I64d%I64d%I64d", &n, &m, &p); printf("%I64d\n", Lucas(n+m, m, p)); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/Mathics/p/4006253.html

你可能感兴趣的文章
day1 用户登陆三次机会
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
LeetCode Ones and Zeroes
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
css important
查看>>
KindEditor图片上传到七牛云
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>
批处理/DOS命令删除文件夹下某类型的文件
查看>>
模板 - 数学 - 矩阵快速幂
查看>>
优秀的持久层框架Mybatis,连接数据库快人一步
查看>>
PAT L2-016 愿天下有情人都是失散多年的兄妹
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>
使用SwingWork反而阻塞SwingUI
查看>>
Windchill中如何扩展字段长度?
查看>>
pytorch中的forward前向传播机制
查看>>