HDOJ(HDU) 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循环操作,且每次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

这道题利用 排列组合Cn(m)(也就是从n个元素中任取m个元素)的思考方式,实现过程用杨辉三角(因为杨辉三角的值 可以对1007取余并保存)。
现在解释一下为什么这道题跟排列组合有关:
假设现在有4个 小球 A B C D 要从中取2个 用排列组合的方式:先取A 然后依次取 B C D ;接下来 取B 然后依次取C D ;接下来取C 只能 取剩下的D 这样就有3 + 2 + 1 = 6 种组合。
这里的4 就是题目的n 这里的2就是题目的m(循环次数);
如果 循环次数为3 那么 先取A 再取B 然后依次 取 C D;
所以题目问的操作次数 也就是 问有多少种取球方式;

解题思路:求类似这样的问题。第一次怎么样。第二次怎么样,必定存在一定的规律,或是函数关系,或是递归。耐心写下几组。甚至几十组測试数据 ,你就会慢慢发现当中的联系。

本题最重要的是建立模型 你会发现这是一个杨辉三角模型:

import java.util.Scanner;

public class Main{
    static int db[][] = new int[2005][2005];
    public static void main(String[] args) {
        dabiao();
        Scanner sc = new Scanner(System.in);

        int t =sc.nextInt();
        while(t-->0){
            int m =sc.nextInt();
            int n = sc.nextInt();
            System.out.println(db[n][m]);
        }

    }
    private static void dabiao() {
        for(int i=1;i<=2000;i++){
            db[1][i]=0;
            db[i][1]=i%1007;
        }
        for(int i=2;i<=2000;i++){
            for(int j=2;j<=i;j++){
                db[i][j] = (db[i-1][j]+db[i-1][j-1])%1007;
            }
        }
    }

}
时间: 2024-08-01 08:48:19

HDOJ(HDU) 1799 循环多少次?(另类杨辉三角)的相关文章

HDOJ 2032 杨辉三角

Problem Description 还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 Input 输入数据包含多个测试实例,每个测试实例的输入只包含一个正整数n(1<=n<=30),表示将要输出的杨辉三角的层数. Output 对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行. Sample Input 2 3 Sam

C语言打印杨辉三角示例汇总_C 语言

杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一.在高中的时候我们又知道,杨辉三角的任意一行都是的二项式系数,n为行数减1.也就是说任何一个数等于这个是高中的组合数.n代表行数减1,不代表列数减1.如:第五行的第三个数就为=6. 现在我们按第一种思路来写:先定义一个二维数组:a[N][N],略大于要打印的行数.再令两边的数为1,即当每行的第一个数和

Python极简代码实现杨辉三角示例代码_python

杨辉三角,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列. 把每一行看做一个list,写一个generator,不断输出下一行的list 实现下列输出效果: # [1] # [1, 1] # [1, 2, 1] # [1, 3, 3, 1] # [1, 4, 6, 4, 1] # [1, 5, 10, 10, 5, 1] # [1, 6, 15, 20, 15, 6, 1] # [1, 7, 21, 35, 35, 21, 7, 1] # [1, 8, 28, 56, 70,

用Javascript打印杨辉三角

var arr = new Array(); for(var i = 0 ;i < 6 ; i++){ if(i == 0){arr.push(1);} else if(i == 1){arr = new Array();arr.push(1);arr.push(1);} else{ var arr2 = new Array(); arr2.push(1); for(var j = 0;j<arr.length - 1; j++){arr2.push(arr[j] + arr[j+1]);}

C语言小程序 杨辉三角示例代码

输入要显示的杨辉三角的行数,会打印出金字塔型的杨辉三角,不过行数太多的话,效果不太好,可以再调整一下格式控制   复制代码 代码如下: #include <stdio.h> #include <stdlib.h> int main() {  int i,j,k;  int line;  int *prev, *next;  printf("输入要查看杨辉三角的行数(大于2):");  scanf("%d",&line);  if(li

批处理杨辉三角效果实现代码

 这篇文章主要介绍了批处理打印彩色的杨辉三角效果实现代码,喜欢的朋友可以测试下 效果图:   代码如下: @echo off&color 0e setlocal enabledelayedexpansion mode con: cols=130 lines=130 :top cls ::set /p in=请输入行数: set in=23&set ab=1&set var=64 if "%in%"=="" goto top if %in% g

c语言-杨辉三角等腰三角形求解

问题描述 杨辉三角等腰三角形求解 #include#include#define OK 1#define ERROR -1#define OVERFLOW -2#define MAXQSIZE 100 typedef int Status;typedef struct{ int *base; int front; int rear;}SqQueue; Status InitQueue(SqQueue &Q){ Q.base=(int *)malloc(MAXQSIZE*sizeof(int));

我是刚学的大一生 这道我自己编的杨辉三角问题 但不知道错那里 请高手帮忙 ,谢谢

问题描述 int[,]a=newint[6,6];privatevoidbutton1_Click(objectsender,EventArgse){inti,j;for(i=1;i<7;i++)a[i,i]=1;a[i,1]=1;for(i=3;i<7;i++)for(j=2;j<i;i++){a[i,j]=a[i-1,j]+a[i-1,j-1];}for(i=1;i<7;i++)for(j=1;j<i+1;j++)label1.Text+=a[i,j]+"&qu

庞果网之杨辉三角的变形

题目详情          1      1   1  1   1  2   3  2  1 1  3  6   7  6  3  1 以上三角形的数阵,第一行只有一个数1, 以下每行的每个数,是恰好是它上面的数,左上的数和右上数等3个数之和(如果不存在某个数,认为该数就是0). 求第n行第一个偶数出现的位置.如果没有偶数,则输出-1.例如输入3,则输出2,输入4则输出3. 输入n(n <= 1000000000) [解析] 经过分析得出的结论如下: 1.前两行没有偶数可直接返回-1 2.一下每