思考:用连乘r个商的顺序,否则可能会超出范围。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
using namespace std;
long long work(long long n, long long k) {
if(k > n/2) k = n - k;
if(k == 0 || n == k) return 1;
long long i, j;
i = n;
j = 1;
long long a = 1, b = 1;
for(long long t = 1; t <= k; t++) { // notice the order. WA
a *= i;
b *= j;
i--; j++;
if(a%b == 0) {
a /= b;
b = 1;
}
}
return a/b;
}
int main()
{
long long n, k;
while(scanf("%lld%lld", &n, &k) != EOF) {
if(n == 0 && k == 0) break;
long long res = work(n, k);
printf("%lld\n", res);
}
return 0;
}