洛谷题解UVA卡塔兰数题解:UVA12887 The Soldier's Dilemma
xyx404
思路:
设第一个士兵与第 2k+1 个士兵配对(k≥0),则:
- 左侧:前2k个士兵必须形成合法分组,方式数为 Ck。
- 右侧:剩余 2(n−k−1) 个士兵形成合法分组,方式数为 Cn−k−1。
综上:
Cn=k=0∑n−1Ck×Cn−k−1
可以发现其实就是卡塔兰数。
代码:
#include<bits/stdc++.h> using namespace std; #define LL long long #define itn int #define ull unsigned long long LL T,n; LL C[5100]; const int Mod=1e9+7; int main(){ C[0]=1; for(int i=1;i<=5005;i++){ for(int k=0;k<i;k++){ C[i]+=C[k]*C[i-k-1]%Mod; C[i]%=Mod; } } cin>>T; while(T--){ cin>>n; cout<<C[n]<<"\n"; } return 0; }
|