Description
松哥有次突发奇想,决定回高中再上高中数学课,数学老师提了这样一个问题:
有一个分段函数T(0,n)=n(n>0),T(k,n)=T(k-1,1)+T(k-1,2)+…+T(k-1,n)(k>0,n>0).
第一天数学老师问他,松松对于T(1,1)你怎么看?第二天数学老师问他,松松对于T(2,2)你怎么看?第三天数学老师问他,松松对于T(3,3)你怎么看?……松哥怒了,松哥决定一次把所有函数值全部算出来,但是由于他智商有限,所以他想请求你的帮助.
Input
多组测试数据.
每组测试数据包含一个正整数k,n.(0<k,n<1010)
Output
对于每组测试数据,输出T(k,n)mod 100007.
Sample Input
0 2
1 3
2 5
Sample Output
2
6
35
———————————————————————————————————————————
看到公式,我们首先想的二维数组。建立一个二维数组t[1020][1020],由
T(0,n)=n(n>0)
可知,将该二维数组看作矩阵的话,第0行的数全部为所在列的列数;
借此信息再推导,
t[1][1]=t[0][1]=1;
t[2][1]=t[1][1]=1;
t[3][1]=t[2][1]=1;
.........
即 t[k,1]=1;
为了理解
T(k,n)=T(k-1,1)+T(k-1,2)+…+T(k-1,n)
这个信息,我们可以直接利用题目中sample以及已有的信息进行简单推导。
例如“1 3”。
t[1][3]=t[0][1]+t[0][2]+t[0][3]
=t[1][2]+t[0][3]
即 t[k][n]=t[k-1][n]+t[k][n-1];
#include<bits/stdc++.h>
using namespace std;
int t[1020][1020]={0};
int main()
{
int k,n;
int x,y;
for(k=0;k<1020;k++)
{
for(n=1;n<1020;n++)
{
if(k==0)
t[k][n]=n;
else if(n==1)
t[k][n]=1;
else
t[k][n]=(t[k-1][n]+t[k][n-1])%100007;//注意取模
}
}
while(~scanf("%d %d",&x,&y))//注意cout、cin会超时
{
printf("%d\n",t[x][y]);
}
}