1.递推处理O(n^2)
#include <bits/stdc++.h>
using namespace std;
const int N = 1003, null = INT64_MAX;
typedef long long ll;
ll m, x, y, p, n;
int c[N][N];
double eps=1e-6;
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-1]+c[i-1][j]);
}
}
}
int main(){
int n;
cin>>n;
init();
while(n--){
int a,b;
cin>>a>>b;
cout<<c[a][b]<<endl;
}
}
2.通过公式进行逆元运算N log(N)
#include <bits/stdc++.h>
using namespace std;
const int N = 1000003, null = INT64_MAX;
typedef long long ll;
ll fact[N],infact[N],mod=1e9+7;
ll m, x, y, p, n;
ll qmi(ll a,ll b){
ll res=1;
while(b){
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main(){
int n;
cin>>n;
fact[0]=infact[0]=1;
for(int i=1;i<N;i++){
fact[i]=fact[i-1]*i%mod;
infact[i]=infact[i-1]*qmi(i,mod-2)%mod;
}
while(n--){
int a,b;
cin>>a>>b;
cout<<ll(fact[a])*infact[b]%mod*infact[a-b]%mod;
}
}
卢卡斯定理求组合数
#include <bits/stdc++.h>
using namespace std;
const int N = 1000003, null = INT64_MAX;
typedef long long ll;
ll fact[N],infact[N],mod=1e9+7;
ll p;
ll qmi(ll a,ll b){
ll res=1;
while(b){
if(b&1)res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
ll C(ll a,ll b){
ll ans=1;
for(int i=1,j=a;i<=b;i++,j--){
ans=ans*j%p;
ans=ans*qmi(i,p-2)%p;
}
return ans;
}
ll lucass(ll a,ll b){
if(a<p&&b<p)
return C(a,b);
else return C(a%p,b%p)*lucass(a/p,b/p)%p;
}
int main(){
int n;
cin>>n;
while(n--){
int a,b;
cin>>a>>b>>p;
cout<<lucass(a,b)%p<<endl;
}
}
不约分的大数排列组合
#include <bits/stdc++.h>
using namespace std;
const int N = 1000003, null = INT64_MAX;
typedef long long ll;
ll fact[N], infact[N], mod = 1e9 + 7;
bool f[N];
int prim[N], sum[N], cnt;
void sushu(int n) {
for (int i = 2; i <= n; i++) {
if (!f[i])
prim[cnt++] = i;
for (int j = 0; j <= n / i; j++) {
f[i * prim[j]] = true;
if (i % prim[j] == 0)break;
}
}
}
int get(int n, int p) {
int res = 0;
while (n) {
res += n / p;
n = n / p;
}
return res;
}
vector<int> mul(vector<int> a, int b) {
vector<int> c;
int t = 0;
for (int i = 0; i < a.size(); i++) {
t += a[i] * b;
c.push_back(t % 10);
t /= 10;
}
while (t) {
c.push_back(t % 10);
t /= 10;
}
return c;
}
int main() {
int a, b;
cin>>a>>b;
sushu(a);
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> v;
v.push_back(1);
for(int i=0;i<cnt;i++){
for(int j=0;j<sum[i];j++){
v=mul(v,prim[i]);
}
}
for(int i=v.size()-1;i>=0;i--)cout<<v[i];
}