A - 递推
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescription
我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分。例如,
如果代码中出现
for(i=1;i<=n;i++) OP ;
那么做了n次OP运算,如果代码中出现
fori=1;i<=n; i++)
for(j=i+1;j<=n; j++) OP;
那么做了n*(n-1)/2 次OP 操作。
现在给你已知有m层for循环操作,且每次for中变量的起始值是上一个变量的起始值+1(第一个变量的起始值是1),终止值都是一个输入的n,问最后OP有总共多少计算量。
如果代码中出现
for(i=1;i<=n;i++) OP ;
那么做了n次OP运算,如果代码中出现
fori=1;i<=n; i++)
for(j=i+1;j<=n; j++) OP;
那么做了n*(n-1)/2 次OP 操作。
现在给你已知有m层for循环操作,且每次for中变量的起始值是上一个变量的起始值+1(第一个变量的起始值是1),终止值都是一个输入的n,问最后OP有总共多少计算量。
Input
有T组case,T<=10000。每个case有两个整数m和n,0<m<=2000,0<n<=2000.
Output
对于每个case,输出一个值,表示总的计算量,也许这个数字很大,那么你只需要输出除1007留下的余数即可。
Sample Input
2
1 3
2 3
Sample Output
3
3
//尴尬,这题没找出规律,,,就是你画个 n,m 的二维的表,就很容易看出规律了
具体的原因
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #define MAXN 2005 3 4 int d[MAXN][MAXN]; 5 6 void count() 7 { 8 int i, j; 9 for(i = 1; i < MAXN; ++i) 10 d[i][1] = i % 1007; 11 12 for(i = 1; i < MAXN; ++i) 13 for(j = 2; j < MAXN; ++j) 14 d[i][j] = (d[i-1][j] + d[i-1][j-1]) % 1007; 15 } 16 17 int main() 18 { 19 int n, m, t; 20 count(); 21 scanf("%d", &t); 22 while(t--) 23 { 24 scanf("%d%d", &m, &n); 25 printf("%d ", d[n][m]); 26 } 27 return 0; 28 }