zoukankan      html  css  js  c++  java
  • HUAS Summer Trainning #3 M

    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
    题目大意:给你m(循环的层数),n(每层循环到这个数)2个数,如果第一层从1开始,第二层从2,...第i层从i,后面的起始数是前一层数+1,
    输出总共的计算的次数。
    题目思路:每次都是m层,n个数,就相当于是从n个数中选m个数出来,这就要用到高中数学里的一个公式:
    c(n,m)=c(n-1,m-1)+c(n-1,m)通过这个公式把2000以内的所有组合打印出来放在一个二维数组中,只要通过输入的m,n就能快速的找到值。
    (注意每个数要对1007取余,否则int放不下)。
    代码:
     1 #include<iostream>
     2 using namespace std;
     3 const int maxn=2000+20;
     4 int p[maxn][maxn];
     5 void set()
     6 {
     7     for(int i=1;i<=2000;i++)
     8         p[1][i]=i%1007,p[i][i]=1;
     9 
    10     for(int  i=2;i<=2000;i++)
    11         for(int j=i+1;j<=2000;j++)
    12             p[i][j]=(p[i-1][j-1]+p[i][j-1])%1007;
    13 }
    14 int main()
    15 {
    16     int n,m,T;
    17     set();
    18     cin>>T;
    19     while(T--)
    20     {
    21         cin>>m>>n;
    22         cout<<p[m][n]<<endl;
    23     }
    24     return 0;
    25 }
     
  • 相关阅读:
    test
    男神zyh的青睐
    HH的项链
    PAT刷题经验
    LaTeX常用数学符号
    Battle Over Cities Hard Version
    Cut
    文本生成器
    Explorer Space
    2021.04.21
  • 原文地址:https://www.cnblogs.com/huaxiangdehenji/p/4696538.html
Copyright © 2011-2022 走看看