HDU-1799(组合递推公式)

HDOJ-1799 - Fighting_Dream

M - 暴力求解、打表

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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

题目分析:

注意观察到,可以发现循环的值是;C(n,m)=n!/((n-m)!*m!),因为n值过大,不可以直接用公式

组合数学的递推公式:C(n,m)=C(n,m-1)+C(n-1,m-1),只要知道了这个问题就可以解决了

注意:

全排列问题,C(n,m)=n!/(m!*(n-m)!)

但是考虑到n的值过大,不能用这个方法
 可以用组合公式C(n,m)=C(n-1,m)+C(n-1,m-1)
 C(n,1)=n; C(n,n)=1; C(n,0)=1;

AC代码:

# include<stdio.h>
int c[2001][2001];
void juge()
{
    for(int i= 1; i<= 2000; i++)
    {
        c[0][0] = 1;
        c[i][0] = 1;
        for(int j=1; j<= 2000; j++)
            c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % 1007;  //组合公式
    }
}
int main()
{
    int T, n, m;
    juge();
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d %d", &m, &n);
        printf("%d\n", c[n][m]);
    }
}
时间: 2024-12-11 06:25:32

HDU-1799(组合递推公式)的相关文章

HDU 1799 循环多少次?

/* 中文题意: 中文翻译: 题目大意:求循环的次数. 解题思路:如下: 难点详解:画表会发现和杨辉三角有点像,这就有了写下去的希望.但输出时m和n不一样,这样就要在调试中发现规律,才可输出正确的结果. 关键点:画表格,从中发现规律,进而解答这题. 解题人:lingnichong 解题时间:2014/08/01     00:08 解题感受:当时没写出来,后来会长说了一下,有了一些思路,就按这个思路写了下来.还是那个宗旨,题目看不懂可以,会写就行,写对了就行,不在乎你是什么方法.还有就是做题时要

HDU 4832 组合计数dp

Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 509    Accepted Submission(s): 198 Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字

hdu 1799 (循环多少次?)(排列组合公式)

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3051    Accepted Submission(s): 1117 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算

HDU 1799 循环多少次?(组合数学)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1799 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循环操作,且每

HDU 1799 循环多少次?(DP+组合数学)

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3984    Accepted Submission(s): 1513 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算

hdu 1799 循环多少次?

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有总共多少计

hdu 1799 原来还有公式。。没教过。。C(n)(m)=C(n-1)(m)+C(n-1)(m-1)

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3096    Accepted Submission(s): 1144 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算

HDU 1799

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有总共多少计

HDU 1799 循环多少次? 解题心得

原题 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有