#include <stdio.h>#include <string.h>#define MAX 11000void reverse(char *from, char *to);void call_mult(char *first, char *second, char *result);void call_minus(char *first, char *second, char *result);void call_add(char *first, char *second, char *result);void call_divide(char *first, int div, char *result);int main(){ char buf[MAX], temp[MAX]; int n, k, i; char res[MAX]; setvbuf(stdout, NULL, _IONBF, 0); while (scanf("%d%d", &n, &k) != EOF) { sprintf(buf, "%d", n); for (i = 1; i < k; i++) { sprintf(temp, "%d", n - i); call_mult(buf, temp, res); strcpy(buf, res); } for (i = 2; i <= k; i++) { call_divide(buf, i, res); strcpy(buf, res); } printf("%d\n", strlen(res)); } return 0;}void reverse(char *from, char *to){ int len = strlen(from), i; for (i = 0; i < len; i++) { to[i] = from[len - 1 - i]; } to[len] = '\0';}void call_mult(char *first, char *second, char *result){ char F[MAX], S[MAX], Res[MAX]; int f_len, s_len, f, s, r, r_len, sum, carry; f_len = strlen(first); s_len = strlen(second); r_len = f_len + s_len; r = -1; reverse(first, F); reverse(second, S); for (f = 0; f < r_len; f++) Res[f] = '0'; Res[f] = '\0'; for (s = 0; s < s_len; s++) { for (f = 0, carry = 0; f < f_len; f++) { sum = (F[f] - '0') * (S[s] - '0') + (Res[f + s] - '0') + carry; Res[f + s] = sum % 10 + '0'; carry = sum / 10; if (f + s > r) r = f + s; } while (carry) { sum = (Res[f + s] - '0') + carry; Res[f + s] = sum % 10 + '0'; carry = sum / 10; if (f + s > r) r = f + s; f++; } } for (; r > 0 && Res[r] == '0'; r--); Res[r + 1] = '\0'; reverse(Res, result);}void call_minus(char *first, char *second, char *result){ char F[MAX], S[MAX]; int f_len, s_len, now, borrow, sum; f_len = strlen(first); s_len = strlen(second); reverse(first, F); reverse(second, S); for (now = 0, borrow = 0; now < f_len && now < s_len; now++) { sum = (F[now] - '0') - (S[now] - '0') - borrow; if (sum < 0) { borrow = 1; F[now] = sum + 10 + '0'; } else { borrow = 0; F[now] = sum + '0'; } } for (; now < f_len && borrow; now++) { sum = (F[now] - '0') - borrow; if (sum < 0) { borrow = 1; F[now] = sum + 10 + '0'; } else { borrow = 0; F[now] = sum + '0'; } } for (now = f_len - 1; now > 0 && F[now] == '0'; now--); F[now + 1] = '\0'; reverse(F, result);}void call_add(char *first, char *second, char *result){ char F[MAX], S[MAX], Res[MAX]; int f_len, s_len, now, carry, sum; f_len = strlen(first); s_len = strlen(second); reverse(first, F); reverse(second, S); for (now = 0, carry = 0; now < f_len && now < s_len; now++) { sum = (F[now] - '0') + (S[now] - '0') + carry; Res[now] = sum % 10 + '0'; carry = sum / 10; } for (; now < f_len; now++) { sum = (F[now] - '0') + carry; Res[now] = sum % 10 + '0'; carry = sum / 10; } for (; now < s_len; now++) { sum = (S[now] - '0') + carry; Res[now] = sum % 10 + '0'; carry = sum / 10; } if (carry) Res[now++] = carry + '0'; Res[now] = '\0'; reverse(Res, result);}void call_divide(char *first, int div, char *result){ char Res[MAX]; int len = strlen(first); int remainder = 0, now, sum; for (now = 0; now < len; now++) { sum = remainder * 10 + (first[now] - '0'); Res[now] = sum / div + '0'; remainder = sum % div; } Res[now] = '\0'; for (now = 0; Res[now] == '0'; now++); strcpy(result, &Res[now]); if (strlen(result) == 0) strcpy(result, "0");}