1247: 球迷购票问题

来源:互联网 发布:管家婆的数据在哪里面 编辑:程序博客网 时间:2024/06/09 20:57

<h2>描述</h2>

球赛门票的售票处规定每位购票者限购一张门票,且每张门票售价50元。购票者中有m位手持50元钱币,另有n人手持100元。假设售票处开始售票时无零钱。问这m+n人有几种排队方式可使售票处不致出现找不出钱的局面。

<!--more-->

对给定的m,n(0&lt;=m,n&lt;=5000),计算出排队方式总数。输入数据第1行为测试数据的个数t,余下的t行每行有两个整数m和n。对每一组测试数据输出方案数。

<h2>Example Input</h2>

<pre>3

3 2

2 0

1 1</pre>

<h2>Example Output</h2>

<pre>5

1

1</pre>

<pre>这道题我是无解了 通过递归肯定死啊 高精度问题 最后康哥出马搞定  先贴出来 占位</pre>

<pre>#include &lt;stdio.h&gt;

#include &lt;math.h&gt;

 

int a[100005];

 

void output(int x);

 

void process(int m, int n)  /////(m-n+1)/(m+1)C(m+n,m)

{

     int mm=m+n;

     int x=(int)log(mm)*mm/15+2;

     int i,j,k,sign;

     a[0]=m-n+1;

     for(i=1;i&lt;x;i++)

     a[i]=0;

     while(mm&gt;n)

     {

         sign=0;

         for(i=0;i&lt;x;i++)

         {

             k=a[i]*mm+sign;

             a[i]=k%100000;

             sign=k/100000;

         }

         mm--;

     }

     m++;

     while(m&gt;1)

     {

         sign=0;

         for(i=x;i&gt;=0;i--)

         {

             k=sign*100000+a[i];

             a[i]=k/m;

             sign=k%m;

         }

         m--;

     }

     output(x);

}

 

void output(int x)

{

     int i,j;

     for(i=x;i&gt;=0;i--)

     {

         if(a[i]!=0)

         break;

     }

     printf("%d",a[i]);

     i--;

     for(;i&gt;=0;i--)

     {

         if(a[i]&lt;=9)

         printf("0000%d",a[i]);

         else if(a[i]&lt;=99)

         printf("000%d",a[i]);

         else if(a[i]&lt;=999)

         printf("00%d",a[i]);

         else if(a[i]&lt;=9999)

         printf("0%d",a[i]);

         else

         printf("%d",a[i]);

     }

     printf("/n");

}

 

int main(void)

{

     int m,n,t;

     scanf("%d",&amp;t);

     while(t--)

     {

         scanf("%d%d",&amp;m,&amp;n);

         if(m&lt;n)

         printf("0/n");

         else if(n==0)

         printf("1/n");

         else

         process(m,n);

     }

     return 0;

}</pre>

原创粉丝点击