一个算大数组合数的方法

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;
}
posted @ 2020-12-14 15:46  0xYuk1  阅读(184)  评论(0)    收藏  举报