刷了几道组合数取模的题,模板都是一样的 Lucas定理
关于Lucas定理 https://blog.csdn.net/cai_haiq/article/details/75954298 这个博客讲得很好
下面是模板
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
const int INF = 0x3f3f3f3f;
const ll p = 1e9+7;
ll nn,mm,kk;
ll qpow(ll n, ll m, ll p)
{
ll res=1;
while(m)
{
if(m%2!=0)
{
res*=n;
res%=p;
}
n*=n;
n%=p;
m/=2;
}
return res;
}
ll C(ll n,ll m,ll p)
{
if(m>n) return 0;
ll a=1,b=1;
while(m)
{
a*=n;
a%=p;
n--;
b*=m;
m--;
b%=p;
}
return a*qpow(b,p-2,p)%p;
}
ll Lucas(ll n,ll m,ll p)
{
if(m==0)
return 1;
return Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
int main()
{
std::ios::sync_with_stdio(false);
int t;
while(cin>>nn>>mm)
{
if(nn<mm)swap(nn,mm);
ll b=Lucas(nn+mm-4,nn-2,p)%p;
cout<<b<<endl;
}
return 0;
}
例题
1、hdu3037 http://acm.hdu.edu.cn/showproblem.php?pid=3037
公式:
n棵树储存m个豆子
问题转化为
假设n+m棵树,每棵树最多储存一个豆子
这样就是上面那个公式
2、hdu5894 http://acm.hdu.edu.cn/showproblem.php?pid=5894
公式
证明
https://blog.csdn.net/hjt_fathomless/article/details/52588392
3、hdu6114 http://acm.hdu.edu.cn/showproblem.php?pid=6114
这个比较简单
公式
从n行里面选出m行,按照1-m放进去就行
hdu5698 http://acm.hdu.edu.cn/showproblem.php?pid=5698
公式
题解
https://blog.csdn.net/qwb492859377/article/details/51478117
虽然看了题解我还是不理解 但是感觉和hdu3037有点像