12 day 1

#include <cstdio>
int i,j,m,n,t;
long long f[6000][6000];
inline int min(int a,int b){
	return a<b?a:b;
}
int main(){
//	freopen("ticket.in","r",stdin);
//	freopen("ticket.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i) f[i][0]=1;
	for(i=1;i<=n;++i){
		t=min(m,i);
		for(j=1;j<=t;++j){
			if(i==j){
				f[i][j]=f[i][j-1];
			}else{
				f[i][j]=f[i][j-1]+f[i-1][j];
			}
		}
	}
	printf("%lld\n",f[n][m]);
	return 0;
}

恩简单的代码。。。没有高精度会爆精度。。再修改+推导吧。

Update:由于找规律。。发个找规律代码

#include <cstdio>
int i,j,m,n,t;
long long f[6000][6000];
inline int min(int a,int b){
    return a<b?a:b;
}
int main(){
//  freopen("ticket.in","r",stdin);
//  freopen("ticket.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i) f[i][0]=1;
    for(i=1;i<=n;++i){
        t=min(m,i);
        for(j=1;j<=t;++j){
            f[i][j]=f[i][j-1]+f[i-1][j];// 由于当j>i是f[i][j]=0那么也就没问题啦这么写
            printf("%d\t",f[i][j]);
        }
        putchar('\n');
    }
    printf("%lld\n",f[n][m]);
    return 0;
}

恩然后输出。。

1
2       2
3       5       5
4       9       14      14
5       14      28      42      42
6       20      48      90      132     132
7       27      75      165     297     429     429
8       35      110     275     572     1001    1430
9       44      154     429     1001    2002    3432
10      54      208     637     1638    3640    7072

 恩第一列是$x$.第二列是$\frac{x(x+1)}{2}-1$,第三列由于是第二列的前缀和

posted @ 2014-10-20 15:42  zball  阅读(169)  评论(0编辑  收藏  举报