【JZOJ】WZK打雪仗

D e s c r i p t i o n Description Description

2 n 2n 2n个人在一个圆圈里
(按顺序排)
有n个人要到另外n个人那
问有多少种方法
使他们的路径不会交叉

I n p u t Input Input

一个数,n

O u t p u t Output Output

一个数,方案数、
在这里插入图片描述

S a m p l e I n p u t Sample Input SampleInput
5
S a m p l e O u t p u t Sample Output SampleOutput
42

思路

卡特兰数
高精压位
我是用下图的规律(二维)】
F [ i ] [ j ] = F [ i − 1 ] [ j ] + F [ i ] [ j − 1 ] F[i][j]=F[i-1][j]+F[i][j-1] F[i][j]=F[i1][j]+F[i][j1]
在这里插入图片描述

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define INF 1000000000
#define ll long long
using namespace std;
int F[125][125][10];
int n;
void Add(int *A,int *X,int *Y)
{
	int l=0;
	for(int i=1;i<=10;++i)
	{
		l=X[i]+Y[i]+l;
		A[i]=l%INF;
		l/=INF;
	}
	return;
}
void Write(int *A)
{
	int l=11;
	while(!A[--l] && l>1);
	printf("%d",A[l]);
	while(--l)
	{
		if(A[l]<1e8)printf("0");
		if(A[l]<1e7)printf("0");
		if(A[l]<1e6)printf("0");
		if(A[l]<1e5)printf("0");
		if(A[l]<1e4)printf("0");
		if(A[l]<1e3)printf("0");
		if(A[l]<1e2)printf("0");
		if(A[l]<1e1)printf("0");
		printf("%d",A[l]);
	}
	return;
}
int main()
{
	freopen("war.in","r",stdin);
	freopen("war.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1;i<=n;++i)F[1][i][1]=i;
	for(int i=2;i<=n;++i)
		for(int j=i;j<=n;++j)
			Add(F[i][j],F[i-1][j],F[i][j-1]);
	Write(F[n][n]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值