【HDU】1799 循环多少次?

49 篇文章 0 订阅
1 篇文章 0 订阅
问题描述
  我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分。例如,
如果代码中出现
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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值