Buy the Ticket

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8838    Accepted Submission(s): 3684

Problem Description

The "Harry Potter and the Goblet of Fire" will be on show in the next few days. As a crazy fan of Harry Potter, you will go to the cinema and have the first sight, won’t you?

Suppose the cinema only has one
ticket-office and the price for per-ticket is 50 dollars. The queue for
buying the tickets is consisted of m + n persons (m persons each only
has the 50-dollar bill and n persons each only has the 100-dollar bill).

Now
the problem for you is to calculate the number of different ways of the
queue that the buying process won't be stopped from the first person
till the last person.
Note: initially the ticket-office has no money.

The
buying process will be stopped on the occasion that the ticket-office
has no 50-dollar bill but the first person of the queue only has the
100-dollar bill.

 

Input

The
input file contains several test cases. Each test case is made up of
two integer numbers: m and n. It is terminated by m = n = 0. Otherwise,
m, n <=100.
 

Output

For
each test case, first print the test number (counting from 1) in one
line, then output the number of different ways in another line.
 

Sample Input


Sample Output

Test #:

Test #:

Test #:

题目大意

n+m个人排队买票,票价为50元,其中m个人各手持一张50元钞票,n个人各手持一张100元钞票,除此之外大家身上没有任何其他的钱币,并且初始时候售票窗口没有钱,问有多少种排队的情况数能够让大家都买到票。

题目分析

题解都说是要用到卡特兰数,但是仔细想了想卡特兰数没啥用呀.....算是他的一个变种,但是公式还是要现推的。

如果m=n,那么就是一个标准的卡特兰数,但是本题m和n不相等,不能直接用卡特兰的公式。

在不考虑不同的人的情况下,假设正确的方法有Dm+n个,无法满足题意的方法有Wn+m个,那么Dm+n +Wn+m =

我们假设最早买不到票的人编号是k,他手持的是100元并且售票处没有钱,那么将前k个人的钱从50元变成100元,从100元变成50元,这时候就有m+1个人手持50元,n-1个手持100元的,也就是说Wn+m=

所以我们可以知道,Dm+n= -

所以最终的答案化简为:(m+n)! * (m+1-n)/(m+1)

需要注意的是:

  • 阶乘是个大数乘法
  • 如何处理除法

大数阶乘我之前的文章已经写过: 大数阶乘

至于如何处理除法,我们可以我们注意到,如果n!=0,那么m+1必然会在前面的阶乘中求到,跳过不乘即可,最后再乘上个(m+1-n)就行了,如果n=0,那么只需要算前面的阶乘就好了,后面的因数是1。

代码

#include<bits/stdc++.h>

using namespace std;

int anss[],m,n,cnt,temp,i,j,k,t=;

int main()
{
while(scanf("%d %d",&m,&n)&&(m!=||n!=))
{
t++;
if(m<n)
{
cout<<"Test #"<<t<<':'<<endl;
cout<<''<<endl;
continue;
}
memset(anss,,sizeof(anss));
anss[]=;
cnt=; //记录当前结果长度
for(i=;i<=n+m;i++)
{
if(i==m+)
continue;
k=; //记录进位
for(j=;j<=cnt;j++)
{
temp=(anss[j]*i+k)%;
k=(anss[j]*i+k)/;
anss[j]=temp;
}
while(k)
{
anss[++cnt]=k%;
k=k/;
}
}
if(n!=)
{
k=;
for(j=;j<=cnt;j++)
{
temp=(anss[j]*(m+-n)+k)%;
k=(anss[j]*(m+-n)+k)/;
anss[j]=temp;
}
while(k)
{
anss[++cnt]=k%;
k=k/;
}
}
cout<<"Test #"<<t<<':'<<endl;
for(i=cnt;i>=;i--)
printf("%d",anss[i]);
cout<<endl;
}
}

HDU 1133 Buy the Ticket (数学、大数阶乘)的更多相关文章

  1. hdu 1133 Buy the Ticket (大数+递推)

    Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. hdu 1133 Buy the Ticket(Catalan)

    Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  3. HDU——1133 Buy the Ticket

    Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  4. HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)

    Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...

  5. hdu 1133 Buy the Ticket

    首先,记50的为0,100的为1. 当m=4,n=3时,其中的非法序列有0110010; 从不合法的1后面开始,0->1,1->0,得到序列式0111101 也就是说,非法序列变为了n-1 ...

  6. HDU 1133 Buy the Ticket 卡特兰数

    设50元的人为+1 100元的人为-1 满足前随意k个人的和大于等于0 卡特兰数 C(n+m, m)-C(n+m, m+1)*n!*m! import java.math.*; import java ...

  7. Buy the Ticket HDU 1133 卡特兰数应用+Java大数

    Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...

  8. HDU 1060 Leftmost Digit (数学/大数)

    Leftmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. 【HDU 1133】 Buy the Ticket (卡特兰数)

    Buy the Ticket Problem Description The "Harry Potter and the Goblet of Fire" will be on sh ...

随机推荐

  1. SQL server 获取异常

    一.try...... catch 获取异常信息 /*======================================== 相关错误消 息如下: ERROR_NUMBER() 返回错误号. ...

  2. Entity Framework Core 迁移命令

    Add-Migration init Update-Database init 修改model后,执行迁移的命令 更新数据库 每次更新都要{update}修改 Add-Migration {updat ...

  3. win10 1903 更改文字大小

    标题栏 - 菜单 - 消息框 - 调色板标题11- 图标 - 工具提示 - Caption 标题 的 宽/高 - ; 14的宽高 - 菜单 的 宽/高 - ; 的宽高 -; 设置 注册表 HKEY_C ...

  4. BZOJ 3456 城市规划 (组合计数、DP、FFT)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...

  5. SRM331-CarolsSinging(暴力,位运算)

    Problem Statement When the Christmas dinner is over, it's time to sing carols. Unfortunately, not al ...

  6. R_Studio(cart算法决策树)对book3.csv数据用测试集进行测试并评估模型

    对book3.csv数据集,实现如下功能: (1)创建训练集.测试集 (2)用rpart包创建关于类别的cart算法的决策树 (3)用测试集进行测试,并评估模型 book3.csv数据集 setwd( ...

  7. 【转】diamond专题(三)—— diamond架构

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  8. 查准率(precision)和召回率(recall)

    1.定义 查准率(precision):预测患有癌症且预测正确的人数 / 预测有多少人患有癌症 召回率(recall):预测患有癌症且预测正确的人数 / 实际有多少人患有癌症 2.关系 他俩的关系如下 ...

  9. 数据库 mysql 操作

    安装好xammp,打开阿帕奇和数据库服务: 点击右侧 shell 按钮,进入命令行: 首先,利用超级管理员权限进入数据库: mysql -uroot -p enter,再enter 把下述代码复制进命 ...

  10. Cassandra 如何处理跨数据中心的数据库延时问题

    分布式系统的可靠.延时.一致性等问题是一般性问题,不局限于数据库,而Cassandra提供了一个很好的解决思路. Cassandra号称能做到跨数据中心的数据库访问的高效访问,它的实现方式其实是把延时 ...