Description
我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分。例如,
如果代码中出现
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 解题思路:求类似这种问题,把数带进去算几遍,其中必然存在一定的规律,或是函数关系,或是递归,耐心写下几组,甚至几十组测试数据 ,你就会得到其中的联系关键字:排列组合,杨辉三角公式:a[i][j]=(a[i-1][j]+a[i-1][j-1])第一列全为1,a[i][i]也为1. 代码如下:
#include "iostream" #include "stdio.h" #include "string.h" using namespace std; int a[2004][2004]; int main() { int n,m,k,i,j; memset(a,0,sizeof(a)); for( i=1;i<=2000;i++) { a[i][0]=a[i][i]=1; for( j=1;j<i;j++) a[i][j]=(a[i-1][j]+a[i-1][j-1])%1007; } scanf("%d",&n); while (n--) { scanf("%d%d",&m,&k); printf("%d\n",a[k][m]); } return 0; }
时间: 2024-09-29 09:35:32