Buy the Ticket

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


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
3 0 3 1 3 3 0 0
 

 

Sample Output
Test #1: 6 Test #2: 18 Test #3: 180
 

 

Author
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include<cstdio>
#include<cstring>
int a[390];
int n,m,leap;
void bfact(int n)
{
    int i,j;
    for(i=2; i<=n; i++)
    {
        if(leap&&i==m+1) continue;
        int c=0,s;
        for(j=0; j<380; j++)
        {
            s=i*a[j]+c;
            a[j]=s%10;
            c=s/10;
        }
    }
 
}
 
void bx(int n)
{
    int j;
    int s,c=0;
    for(j=0; j<380; j++)
    {
        s=n*a[j]+c;
        a[j]=s%10;
        c=s/10;
    }
 
}
int main()
{
    //freopen("case.in","r",stdin);
    int i,j,c=1;
    while(scanf("%d%d",&m,&n)!=-1)
    {
        if(!m&&!n) break;
        leap=0;
        memset(a,0,sizeof(a));
        a[0]=1;
        printf("Test #%d:\n",c);
        if(m<n)
        {
            printf("0\n");
            c++;
            continue;
        }
        if((m-n+1)%(m+1)==0)
            bx((m-n+1)/(m+1));
        else
        {
            bx(m-n+1);
            leap=1;
        }
        bfact(n+m);
        for(i=380; i>=0; i--)
            if(a[i]) break;
        for(j=i; j>=0; j--)
            printf("%d",a[j]);
        printf("\n");
        c++;
    }
}
//从网上找到了公式  即:结果等于 (m+n)!*(m-n+1)/(m+1)
//那么这题就是高精度问题了

  

posted @   JL_Zhou  阅读(250)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示