階乗をまじめに計算してると途中でオーバーフローするのでは。
多倍長ならそういう心配はないのかも知れないけど。

これなら最終結果がオーバーフローしなければ途中結果もオーバー
フローしない。除算があるけど常に割り切れてるから問題ない。
まあ、多倍長にしたとき除算がめんどうかもね。

int comb (int n, int r) {
int ans = 1, i;
for (i = n; i > n - r; i--)
ans = ans * i / (n - i + 1);
return ans;
}