问题描述
我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分。例如,
如果代码中出现
for(i = 1; i <= n; i ++)OP;
那么做了n次OP运算,如果代码中出现
地法= 1;我<= N; i ++)
for(j = i + 1; j <= n; j ++)OP;
那么做了n *(n-1)/ 2次OP操作。
现在给你已知有m层for循环操作,且每次对于中变量的起始值是上一个变量的起始值1(第一个变量的起始值是1),终止值都是一个输入的N,问最后OP有总共多少计算量。
如果代码中出现
for(i = 1; i <= n; i ++)OP;
那么做了n次OP运算,如果代码中出现
地法= 1;我<= N; i ++)
for(j = i + 1; j <= n; j ++)OP;
那么做了n *(n-1)/ 2次OP操作。
现在给你已知有m层for循环操作,且每次对于中变量的起始值是上一个变量的起始值1(第一个变量的起始值是1),终止值都是一个输入的N,问最后OP有总共多少计算量。
输入
有Ť组的情况下,T <= 10000。每个情况下有两个整数米和N,0 <M <= 2000,0 <N <= 2000。
产量
对于每个情况下,输出一个值,表示总的计算量,也许这个数字很大,那么你只需要输出除1007留下的余数即可。
示例输入
2
1 3
2 3
示例输出
3
3
这里现将所有可能的情况用递推的方法全部求出来,然后储存在数组中。
组合数学的递推公式:C(n,m)=C(n,m-1)+C(n-1,m-1)
AC代码:
//
// main.cpp
// 1799
//
// Created by showlo on 2018/4/9.
// Copyright © 2018年 showlo. All rights reserved.
//
#include <stdio.h>
int ans[2010][2010];
int main() {
int N,m,n;
for (int i=0; i<2001; i++) {
ans[i][1]=i%1007;
ans[i][i]=ans[i][0]=1;
}
for (int i=2; i<2001; i++) {
for (int j=2; j<i; j++) {
ans[i][j]=(ans[i-1][j]+ans[i-1][j-1])%1007;
}
}
scanf("%d",&N);
while (N--) {
scanf("%d %d",&m,&n);
printf("%d\n",ans[n][m]);
}
return 0;
}