#include #include #define MAX 100 #define BN_MAX 1000 struct BigNum { int size; int sign; char num[BN_MAX]; }; typedef struct BigNum BigNum; void bignum_2str(BigNum *a, char *s) { int i; if (a->sign == -1) *s++ = '-'; if (a->size == 0) *s++ = '0'; for (i = a->size-1; i >= 0; i--) *s++ = a->num[i] + '0'; *s = '\0'; } void bignum_str2(char *s, BigNum *r) { int i; r->sign = *s == '-' ? s++, -1 : 1; while (*s == '0' && *s != '\0') s++; r->size = strlen(s); for (i = r->size-1; i >= 0; i--) r->num[i] = (*s++) - '0'; } void bignum_copy(BigNum *a, BigNum *r) { r->sign = a->sign; r->size = a->size; memcpy(r->num, a->num, r->size); } void bignum_add(BigNum *a, BigNum *b, BigNum *r) { int i, j, k, carry, tmp; if (a->sign == b->sign) { r->sign = a->sign; i = j = k = carry = 0; while (i < a->size || j < b->size || carry) { tmp = carry; carry = 0; tmp += i < a->size ? a->num[i++] : 0; tmp += j < b->size ? b->num[j++] : 0; if (tmp >= 10) { carry = 1; tmp -= 10; } r->num[k++] = tmp; } r->size = k; } } BigNum C[MAX+1][MAX+1]; char s[BN_MAX+1]; int main() { int n, p; int i, j; bignum_str2("1", &C[0][0]); for (i = 1; i <= MAX; i++) { bignum_copy(&C[0][0], &C[i][0]); bignum_copy(&C[0][0], &C[i][i]); for (j = 1; j < i; j++) bignum_add(&C[i-1][j], &C[i-1][j-1], &C[i][j]); } for (;;) { scanf("%d %d", &n, &p); if (n == 0 && p == 0) break; bignum_2str(&C[n][p], s); printf("%d things taken %d at a time is %s exactly.\n", n, p, s); } return 0; }