思路:
我们只考虑下三角的情况,然后总数只要乘2即可。
那么我们不难得出,假设我们要走到(i,j)那么我们只能从(i-1,j)向右走或者从(i,j-1)向上走。
那么我们用dp[i][j]表示从(0,0)走到(i,j)且不超越对角线的情况数(仅考虑下三角)。
那么dp[i][j] = dp[i-1][j] + dp[i][j-1]
我们打表一下就可以了.
#include
#define fur(i,a,b) for(int i=(a);i<=(b);i++)
#define cl(a) memset((a),0,sizeof(a))
using namespace std;
typedef long long ll;
inline void gn(long long&x){
int sg=1;char c;while(((c=getchar())<'0'||c>'9')&&c!='-');c=='-'?(sg=-1,x=0):(x=c-'0');
while((c=getchar())>='0'&&c<='9')x=x*10+c-'0';x*=sg;
}
inline void gn(int&x){long long t;gn(t);x=t;}
// (づ°ω°)づe★
ll dp[40][40];
void init(){
cl(dp);
dp[0][0] = 1;
fur(i,1,35){
fur(j,0,i){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
int main(){
//freopen("E:\\data.in","r",stdin);
//freopen("E:\\data.out","w",stdout);
int kase = 0;
init();
while(1){
int t;
gn(t);
if(t == -1) return 0;
printf("%d %d %lld\n",++kase,t,dp[t][t]*2ll);
}
return 0;
}