hdn2049(错排加组合) 递推超时问题!!!!

http://acm.hdu.edu.cn/showproblem.php?pid=2049

不容易系列之(4)——考新郎

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 25945    Accepted Submission(s): 9493

Problem Description

国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的:

首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;

然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.

最后,揭开盖头,如果找错了对象就要当众跪搓衣板...

看来做新郎也不是容易的事情...

假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.

Input

输入数据的第一行是一个整数C,表示测试实例的个数,然后是C行数据,每行包含两个整数N和M(1<M<=N<=20)。

Output

对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。

Sample Input

2
2 2
3 2

Sample Output

1
3

下面几个Time Limit Exceeded

#include <stdio.h>
__int64 d(int t)
{
    __int64 k;
    if(t<=1) k=1;
    else k=t*d(t-1);
    return k;
}
int main()
{
    __int64  a[21]={0,0,1},b[21];
    int i,n=3,m,t,j;
    for(j=0;j<21;j++)
    {
        b[j]=d(j);
    }
    while(n<21)
    {
        a[n]=(n-1)*(a[n-1]+a[n-2]);
    }
    while(scanf("%d",&i)!=EOF)
    {
        while(i--)
        {
            scanf("%d %d",&m,&t);
            printf("%I64d",a[t]*(b[m]/b[t]));
        }
    }
    return 0;
}
#include <stdio.h>
__int64 d(int t)
{
    __int64 k;
    if(t<=1) k=1;
    else k=t*d(t-1);
    return k;
}
int main()
{
    __int64  a[21]={0,0,1},b[21];
    int i,n=3,m,t,j;
    for(j=0;j<21;j++)
    {
        b[j]=d(j);
    }
    while(n<21)
    {
        a[n]=(n-1)*(a[n-1]+a[n-2]);
    }
    while(scanf("%d",&i)!=EOF)
    {
        while(i--)
        {
            scanf("%d %d",&m,&t);
            printf("%I64d",a[t]*(b[m]/b[t]));
        }
    }
    return 0;
}

#include <stdio.h>
__int64 d(int t)
{
    __int64 k;
    if(t<=1) k=1;
    else k=t*d(t-1);
    return k;
}
int main()
{
    __int64  a[21]={0,0,1},b[21];
    int i,n=3,m,t,j;
    for(j=0;j<21;j++)
    {
        b[j]=d(j);
    }
    while(n<21)
    {
        a[n]=(n-1)*(a[n-1]+a[n-2]);
    }
    while(scanf("%d",&i)!=EOF)
    {
        while(i--)
        {
            scanf("%d %d",&m,&t);
            printf("%I64d",a[t]*(b[m]/b[t]));
        }
    }
    return 0;
}

#include <stdio.h>
__int64 d(int t)
{
    __int64 k;
    if(t<=1) k=1;
    else k=t*d(t-1);
    return k;
}
int main()
{
    __int64  a[21]={0,0,1},b[21];
    int i,n=3,m,t,j;
    for(j=0;j<21;j++)
    {
        b[j]=d(j);
    }
    while(n<21)
    {
        a[n]=(n-1)*(a[n-1]+a[n-2]);
    }
    while(scanf("%d",&i)!=EOF)
    {
        while(i--)
        {
            scanf("%d %d",&m,&t);
            printf("%I64d",a[t]*(b[m]/b[t]));
        }
    }
    return 0;
}

经过上面的无数超时实践 终于有AC代码了

#include <stdio.h>
__int64 d(int t)
{
    __int64 k;
    if(t<=1) k=1;
    else k=t*d(t-1);
    return k;
}
int main()
{
    __int64  a[21]={0,0,1},b[21];
    int i,n=3,m,t,j;
    for(j=0;j<21;j++)
    {
        b[j]=d(j);
    }
    while(n<21)
    {
        a[n]=(n-1)*(a[n-1]+a[n-2]);
    }
    while(scanf("%d",&i)!=EOF)
    {
        while(i--)
        {
            scanf("%d %d",&m,&t);
            printf("%I64d",a[t]*(b[m]/b[t]));
        }
    }
    return 0;
}

时间: 2024-10-17 19:11:01

hdn2049(错排加组合) 递推超时问题!!!!的相关文章

hdu2068-RPG的错排-(dp递推式)

去年看错排公式,死都看不懂,基础扎实之后再来看就略懂了. 公式: dp[ n ] = ( n-1 ) * ( dp[n-1] + dp[n-2] ) 解析公式:比如有n个元素,各对应n个正确位置,dp[n]表示这n个元素全部排错的可能. 比如有元素:1 2 3 4 5 ... k ... n 1.假设第n个元素,要它在错误的位置上,则有n-1种情况. 2.对于剩下的n-1个元素,随便取一个位置上的元素k,要它在错误的位置上,则有2种情况 1)它在第n个元素的位置,相当于n和k两个元素交换位置,和

nyist 17 -----纯递归纯递推--超时

#include <iostream>#include<stdio.h>#include<string.h>using namespace std;char a[10002];int b[10002];int n,ans;int f(int x){ int i,t; for(i=0;i<=x-1;i++) { t=f(i); if(a[i]<a[x] && b[x]<t+1) b[x]=t+1; } return b[x];} int

HDU 2068 RPG的错排(排列组合,错排)非常详细~

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068 这道题需要用到错排公式以及高中数学排列组合的知识. 排列组合:[1]排列(从n中拿出m个,并进行排列):A_n_m=n!/(n-m)!=n*(n-1)*(n-2)*........(n-m+1); [2]组合(从n中拿出m个,不进行排列):C_n_m=n!/((n-m)!*m!)=n*(n-1)*(n-2)*........(n-m+1)/(m*(m-1)*.......1); 因此不难得出排

HDU2068 RPG的错排 【组合+错排】

RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7874    Accepted Submission(s): 3217 Problem Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是

2825 codevs危险的组合(递推)

2825 危险的组合 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一些装有铀(用U表示)和铅(用L表示)的盒子,数量均足够多.要求把N个盒子放成一行,但至少有3个U放在一起,有多少种方法? 输入描述 Input Description 包含一个整数N 输出描述 Output Description 输出一个整数表示方法数. 样例输入 Sample Input 样例1:4 样例2:5 样例输出 Sample Output

UVA 557 Burger 排列组合递推

When Mr. and Mrs. Clinton's twin sons Ben and Bill had their tenth birthday, the party was held at the McDonald's restaurant at South Broadway 202, New York. There were 20 kids at the party, including Ben and Bill. Ronald McDonald had made 10 hamburg

Codeforces Round #526 C - The Fair Nut and String /// 组合递推

题目大意: 给定原字符序列 找出其中所有子序列满足 1.序列内字符都为a 2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b 的数量 将整个字符序列用b分开 此时再得到每个b之间a的数量 即 abbgaaba 得到 v[] = { 1 0 2 1 } 此时假设到第 i-1 段 已得到在第 i-1 段内的所有方案数为 ans (长度为1.2.3.... .i-1) 则在第 i 段时 可由前一段的方案数 和 当前段数量 组合得到ans*v[ i ] (长度为2.3.4.... .i)

数学知识--错排公式

错排公式 核心递推公式: D(n) = (n-1) [D(n-2) + D(n-1)] 特殊地,D(1) = 0, D(2) = 1. 问题: 十本不同的书放在书架上.现重新摆放,使每本书都不在原来放的位置.有几种摆法? 这个问题推广一下,就是错排问题,是组合数学中的问题之一.考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排. n个元素的错排数记为D(n). 研究一个排列错排个数的问题,叫做错排问题或称为更列问题. 错排问题最早被尼古拉

杭电---2068 RPG的错排

Problem Description  今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔:第二次猜:R是草儿,P是月野兔,G是公主:第三次猜:R是草儿,P是公主,G是月野兔:......可怜的野骆驼第六次终于把RPG分清楚了.由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们,可现在有N多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只