求C(m,n)的大数模板

#include <cstdio>
#include <cmath>
#include <cstring>
#define MAXN 1000
int goc(int m,int n)
{
	if(m<n)
	{
		m=m^n;
	    n=m^n;
		m=m^n;
	}
	while(m%n)
	{
		int c=m%n;
		m=n;
		n=c;
	}
	return n;
}

void IntToChar(int n,char *s)
{
   int a[MAXN];
   int i=0;
   while(n)
   {
	   a[i++]=n%10;
	   n/=10;
   }
   int j;
   for(j=0;j<i;j++)
	   s[j]=a[i-1-j]+'0';
   s[j]=0;
}

void multiply(char *a,int n)   //模板
{
	char b[MAXN];
	IntToChar(n,b);
	int len1=strlen(a);
	int len2=strlen(b);
	int len=len1+len2;
	int t1[MAXN],t2[MAXN],t[MAXN];
	int i,j;
	for(i=0;i<len1;i++)
		t1[i]=a[len1-i-1]-'0';
	for(i=0;i<len2;i++)
		t2[i]=b[len2-i-1]-'0';
	for(i=0;i<len;i++)
		t[i]=0;
	for(i=0;i<len1;i++)
		for(j=0;j<len2;j++)
			t[i+j]+=t1[i]*t2[j];
	for(i=0;i<len-1;i++)
	{
		t[i+1]+=t[i]/10;
		t[i]%=10;
	}
	while(!t[len-1])
		len--;
	for(i=0;i<len;i++)
		a[i]=t[len-i-1]+'0';
	a[i]=0;
}

void combination(int m,int n)//求C(m,n)
{
	int i,j;
	int *a,*b;
	a=new int[n];
	b=new int[n];
	for(i=0;i<n;i++)
	{
		a[i]=i+1;
		b[i]=m-i;
	}
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			if(b[i]==1)
				break;
			int c=goc(b[i],a[j]);
			b[i]/=c;
			a[j]/=c;
		}
	char ans[MAXN]="1";
	for(i=0;i<n;i++)
		multiply(ans,b[i]);
	puts(ans);
	delete a;
	delete b;
}


使用时直接调用

combination(m,n)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值