一个算大数组合数的方法
ABC185的第三题是一道简单的求组合数,但是问题在于,其求解上限为199取11,这超出了int的范围但是在long long 范围内,因此,解决此题有一个计算大数组合数的小技巧
组合数计算公式为:(n!)/((n-m)!*m!)
因此原式可以化为:(n-m+1)*(n-m+2)...*(n-m+m)/(m!)
高中内容,忘记了
计算大数组合数的方式代码:
//n2个中取tk个
for(int i=1;i<=tk;i++){
res=res*(n2-tk+i)/i;
}
题解:
#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const ll maxn = 1e5 + 50;
const ll mod = 1e9 + 7;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;cin >> n;
ll k,tk;
int n2=n-1;
if(n2-11<11){
tk=n2-11;
}
else tk=11;
ll res=1;
for(int i=1;i<=tk;i++){
res=res*(n2-tk+i)/i;
}
printf("%lld\n",res);
return 0;
}

浙公网安备 33010602011771号