Combinations
Combinations |
Computing the exact number of ways that N things can be taken M at a time can be a great challenge when N and/or M become very large. Challenges are the stuff of contests. Therefore, you are to make just such a computation given the following:
GIVEN:
Compute the EXACT value of:
You may assume that the final value of C will fit in a 32-bit Pascal LongInt or a C long.
For the record, the exact value of 100! is:
93,326,215,443,944,152,681,699,238,856,266,700,490,715,968,264,381,621,
468,592,963,895,217,599,993,229,915,608,941,463,976,156,518,286,253,
697,920,827,223,758,251,185,210,916,864,000,000,000,000,000,000,000,000
Input and Output
The input to this program will be one or more lines each containing zero or more leading spaces, a value for N, one or more spaces, and a value for M. The last line of the input file will contain a dummy N, M pair with both values equal to zero. Your program should terminate when this line is read.
The output from this program should be in the form:
N things taken M at a time is C exactly.
Sample Input
100 6
20 5
18 6
0 0
Sample Output
100 things taken 6 at a time is 1192052400 exactly.===========================================
20 things taken 5 at a time is 15504 exactly.
18 things taken 6 at a time is 18564 exactly.
#include <stdio.h>
#include <stdlib.h>
int gcd(int,int);
void combi(const int,const int);
int main()
{
freopen("Input.txt","r",stdin);
freopen("Output.txt","w",stdout);
int N,M;
while(scanf("%d%d",&N,&M)==2)
if(N|M)
combi(N,M);
return 0;
}
/* calculate the combinition number */
void combi(const int N,const int M)
{
int A[M],B[M];
int i,j;
for(i=0;i<M;i++)
{
A[i]=N-i;
B[i]=i+1;
}
for(j=1;j<M;j++)
for(i=0;i<M;i++)
{
/* find the GCD of each pair when B[] is not 1 */
int GCD=gcd(A[i],B[j]);
if(GCD>1)
{
A[i]/=GCD;
B[j]/=GCD;
}
if(B[j]==1)
break;
}
/* when all elements in B[] are 1 then multiply every element in A[] */
long ans=1;
for(i=0;i<M;i++)
ans*=A[i];
printf("%d things taken %d at a time is %d exactly.\n",N,M,ans);
}
/* return (x,y) by recursive */
int gcd(int x,int y)
{
return (!y)?x:gcd(y,x%y);
}
沒有留言:
張貼留言