【集训Day2】cinema ticket

本文介绍了一种计算卡特兰数特定项的高精度算法,通过递推公式推导出答案,并使用C++实现,适用于需要精确计算的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cinema ticket


在这里插入图片描述

解题思路

易得递推式为 fi,j=fi−1,j+fi,j−1f_{i,j}=f_{i-1,j}+f_{i,j-1}fi,j=fi1,j+fi,j1
已知当 i==ji==ji==jfi,jf_{i,j}fi,j 为卡特兰数的第 iii 项。
可以推得 ans=(n+1−m)(n+m)!m!(n+1)!ans=\frac{(n+1-m)(n+m)!}{m!(n+1)!}ans=m!(n+1)!(n+1m)(n+m)!
需要高精度。

code

#include<iostream>
#include<cstdio>
using namespace std;

int n,m;

struct num{
	int s[10010];
	num operator *(int x)
	{
		num t={0};
		int lst=0;
		for(int i=10000;i;i--)
		{
			t.s[i]=s[i]*x+lst;
			lst=t.s[i]/10;
			t.s[i]%=10;
		}
		return t;
	}
	num operator /(int x)
	{
		num t={0};
		int lst=0;
		for(int i=1;i<=10000;i++)
			lst=lst*10+s[i],t.s[i]=lst/x,lst%=x;
		return t;
	}
	num operator -(num x)
	{
		num t={0};
		for(int i=10000;i;i--)
		{
			if(s[i]>=x.s[i])
				t.s[i]=s[i]-x.s[i];
			else
				t.s[i]=s[i]+10-x.s[i],s[i-1]--;
		}
		return t;
	}
}a,b;

int main()
{
	cin>>n>>m;
	int i,j;
	b.s[10000]=1;
	for(i=1,j=n+m;i<m;i++,j--)
		b=b*j,b=b/i;
	a=b*j,a=a/i;
	num ans=a-b;
	i=0;
	while(!ans.s[i]) i++;
	while(i<=10000) cout<<ans.s[i++];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值