抠门的售票员:售票问题WA30求助

售票处有2n(n<=1000)张票出售,每张票价a元,每人限购一张票。一开始售票处没有钱。而排队购票的前2n人中,正好有n个人持有a元,另n个人持有2a元钱。要让售票处不发生找钱困难,这2n个人有多少种不同的排队方法。

输入格式:
n
输出格式:
排队方案总数(不超过700位)
样例输入:
3
样例输出:
5
时间限制:
1000
空间限制:
262144
提示:
说明:设持a元的人为A,持2a元的人为B,则5种方案为
AAABBB
AABABB
AABBAB
ABAABB
ABABAB
#include<iostream>
using namespace std;
int n;
int dp[1005];
int main(){
	cin >> n;
	dp[0]=1;
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++){
			dp[i]+=dp[j-1]*dp[i-j];
		}
	}
	cout << dp[n];
	return 0;
}

救!!!!!!!!!!!!!!!!!!!!!!

用二维dp,我的代码如下:

#include <bits/stdc++.h>
using namespace std;
long long dp[1001][1001];
int main(){
	int n;
	while (cin >> n){
		memset(dp, 0, sizeof(dp));
		for (int i = 0; i <= n; i++){
			for (int j = 0; j <= i; j++){
				if (j){
					dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
				} else{
					dp[i][j] = 1;
				}
			}
		}
		cout << "     " << dp[n][n] << endl;
	}
}

以下为公式求解:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin >> n;
	long long sum = 1;
	for (int i = 0; i < n; i++){
		sum = sum * (2 * n - i) / (i + 1);
	}
	cout << sum / (n + 1) << endl;
    return 0;
}

麻烦给个解决方案,谢谢 :upside_down_face:

114年OI一场空,不开longlong见祖宗

但这题要高精度啊

Python,用吧

你写个高精度能G吗?

addd

我太懒了,抱歉

6(至少要两个字符G(

第一个样例599个数位,远超过long long了

so高精度,你值得拥有

《python》

高精度+快读+高精度读入:云剪贴板 - 洛谷

(和cin,cout用法一样,不过有些功能不支持)