模板一
范围较小时递推板子:(a,b<2000)支持多组询问 时间复杂度o(N^2)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=2010;
int c[N][N];
void init()
{
for(int i=0;i<N;i++)
{
for(int j=0;j<=i;j++)
{
if(!j)
c[i][j]=1;
else
{
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
}
}
int main()
{
init();
int n;
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
cout<<c[a][b]<<endl;
}
return 0;
}
模板二
范围(a<=1e6):支持多组询问时间复杂度o(N*logN)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=1e5+10;
ll f[N],invf[N];
ll pows(ll a,ll n)
{
ll ans=1;
while(n)
{
if(n&1)
{
ans=ans*a%mod;
}
a=a*a%mod;
n>>=1;
}
return ans;
}
void init()
{
f[1]=1;
invf[1]=pows(f[1],mod-2);
for(int i=2; i<N; i++)
{
f[i]=f[i-1]*i%mod;
invf[i]=pows(f[i],mod-2);
}
}
ll c(ll a,ll b)
{
return f[a]*invf[a-b]%mod*invf[b]%mod;
}
int main()
{
init();
int n;
cin>>n;
while(n--)
{
ll a,b;
cin>>a>>b;
if(a==b)
{
cout<<1<<endl;
}
else
cout<<c(a,b)<<endl;
}
return 0;
}
模板三
范围 a<1e18 p<1e5;
卢卡斯定理:
C{a,b}同余C{a%p,b%p}*C{a/p,b/p};在modP意义下
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=1e5+10;
ll p;
ll pows(ll a,ll n)
{
ll ans=1;
while(n)
{
if (n & 1)
{
ans=ans*a%p;
}
a=a*a%p;
n>>=1;
}
return ans;
}
ll C(ll a,ll b)
{
if (b > a)
return 0;
ll res=1;
for(ll i=1,j=a; i<=b; i++,j--)
{
res=res*j%p;
res=res*pows(i,p-2)%p;
}
return res;
}
ll lucas(ll a,ll b)
{
if(a<p&&b<p)
return C(a,b);
return (C(a%p,b%p)*lucas(a/p,b/p))%p;
}
int main()
{
int n;
cin>>n;
while(n--)
{
ll a,b;
cin>>a>>b>>p;
cout<<lucas(a,b)<<endl;
}
return 0;
}
模板四
求:C{A,B} 不mod 需要高精度
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=1e5+10;
int prim[N],cnt;
int st[N];
int sum[N];
void prime()//欧拉筛素数
{
for(int i=2;i<N;i++)
{
if(!st[i])
prim[cnt++]=i;
for(int j=0;prim[j]<=N/i;j++)
{
st[prim[j]*i]=1;
if(i%prim[j]==0)
break;
}
}
}
int get(int x,int p)//求素数出现的次数
{
int res=0;
while(x)
{
res+=x/p;
x=x/p;
}
return res;
}
vector<int> mul(vector<int> a,int p)
{
vector<int >g;
int t=0;
for(int i=0;i<a.size();i++)
{
t+=a[i]*p;
g.push_back(t%10);
t/=10;
}
while(t)
{
g.push_back(t%10);
t/=10;
}
return g;
}
int main()
{
int a,b;
cin>>a>>b;
prime();
for(int i=0;i<cnt;i++)
{
int p=prim[i];
sum[i]=get(a,p)-get(b,p)-get(a-b,p);
}
vector<int> res;
res.push_back(1);
for(int i=0;i<cnt;i++)
{
for(int j=0;j<sum[i];j++)
{
res=mul(res,prim[i]);
}
}
for(int i=res.size()-1;i>=0;i--)
{
cout<<res[i];
}
cout<<endl;
return 0;
}