/* ACM 530 Binomial Showdown
* mythnc
* 2011/11/12 09:39:41
* run time: 0.004
*/
#include <stdio.h>
#define MAXARY 50
int com(int, int);
int gcd(int, int);
int main(void)
{
int m, n;
while (scanf("%d %d", &n, &m) && n != 0)
printf("%d\n", com(n, m));
return 0;
}
/* com: return the combined times */
int com(int n, int m)
{
int i, j, factor, tmp;
int num[MAXARY];
if (m == n || m == 0)
return 1;
if (m > n - m)
m = n - m;
/* init */
for (i = 0; i < m; i++)
num[i] = n - m + 1 + i;
/* simplify */
for (i = m; i > 1; i--) {
tmp = i;
for (j = 0; j < m; j++) {
if (num[j] % tmp == 0) {
num[j] /= tmp;
break;
}
factor = gcd(tmp, num[j]);
if (factor > 1) {
tmp /= factor;
num[j] /= factor;
}
}
}
/* product */
for (i = 1; i < m; i++)
num[0] *= num[i];
return num[0];
}
/* gcd: return the gcd of a and b */
int gcd(int a, int b)
{
while ((a %= b) && (b %= a))
;
return a + b;
}
20111112
ACM 530 Binomial Showdown
同ACM369。
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言