D Bouquet
组合数问题
cn1+cn2+…+cnn=2^n-1(快速幂)
res=cn1+cn2+…+cnn-cna-cnb=2^n-1-cna-cnb
cna,cnb可直接用公式(用逆元求)【涉及一些数论知识(0?0)我不懂qwq】
学习准备:***Lucas定理 费马小定理 中国剩余定理 乘法逆元 ***
->解决组合数问题
记录代码:
#include<iostream>
using namespace std;
long long const p=1e9+7;
long long a,b,n,res;
long long quickpow(long long a,long long b)
{
long long r=1;
while(b)
{
if(b&1)
r=r*a%p;
a=a*a%p;
b>>=1;
}return r%p;
}
long long jiec(long long a,long long b)
{
long long s=1;
for(int i=a;i<=b;++i)
{
s=s*i%p;
}
return s%p;
}
int main()
{
cin>>n>>a>>b;
res=quickpow(2,n)+p-1;res%=p;
long long xa=jiec(1,a);xa=quickpow(xa,p-2);
long long xb=jiec(1,b);xb=quickpow(xb,p-2);
long long na=jiec(n-a+1,n);
long long nb=jiec(n-b+1,n);
res+=p+p-na*xa%p-nb*xb%p;
res=res%p;
cout<<res;
}