hdu 1799 DFS求组合数
2012-05-07 02:34
169 查看
循环多少次Problem 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 |
#include <stdio.h> #include <string.h> #define MODE 1007 int ans[2001][2001]; ///结果是C(n,m),接下来求C(n,m)就用到了公式C(n,m)=C(n-1,m)+C(n-1,m-1) int dfs(int x,int y) { if(ans[x][y] >=0) return ans[x][y]; ans[x][y] = (dfs(x - 1, y)%MODE + dfs(x - 1, y - 1)%MODE)%MODE; return ans[x][y]; } int main() { int t; memset(ans,-1,sizeof(ans)); ///初始化为 -1,开始直接忽略了取模后可以为0 for(int i = 0; i < 2001; ++i) ans[i][i] = ans[i][0] = 1; int m,n; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); int res = 0; if(m <= n) res = dfs(n,m); printf("%d\n",res); } return 0; }
相关文章推荐
- hdu 2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树★
- hdu 2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树★
- hdu 1716 排列2 dfs 组合
- hdu 1799 循环多少次(DP,排列组合Cn(m))
- hdu 1799 (循环多少次?)(排列组合公式)
- [ACM] hdu 1521 排列组合(组合+DFS)
- hdu 1027 Ignatius and the Princess II【dfs 排列组合】
- [ACM] hdu 1521 排列组合(组合+DFS)
- [ACM] hdu 1521 排列组合(组合+DFS)
- HDU 1799 循环多少次?(组合数学)
- HDU-1799(组合递推公式)
- HDU 1799 循环多少次?(组合数学)
- hdu 1799 排列组合求C(n,m)+预处理
- hdu 1799 组合 差分数列
- Hdu 1799 循环多少次?【排列组合】
- HDU:1799 循环多少次?(组合,杨辉三角)
- HDU1799 循环多少次?【排列组合】
- hdu 1258 从n个数中找和为t的组合 (DFS)
- HDU 1799 循环多少次?(排列组合,dp)
- hdu 1799 循环多少次?(排列组合,思路)