题面:
现在告诉你n和m的值,请输出对应的组合数Cnm 的值
输入
输入一行两个整数n和m,其中 1<=m<=n<=1000
输出
输出对应的组合数的值
分析:先判断质数,再计算个数,最后计算高精指数幂
#include<bits/stdc++.h>
#define nl unsigned long long
using namespace std;
nl n, k;
nl prime[843][2], cnt = 1, ans[10022];
void is_prime() {//找质数
for (nl i = 2; i <= n; i++) {
int flag = 0;
for (nl j = 2; j * j <= i; j++) {
if (i % j == 0) {
flag = 1;
break;
}
}
if (flag == 0) {
prime[cnt][0] = i;
cnt++;
}
}
}
void get() {//数个数
for (nl i = 1; i < cnt; i++) {
nl tmp = 1;
while (n >= (tmp * prime[i][0])) {
tmp *= prime[i][0];
prime[i][1] += n / tmp;
}
}
for (nl i = 1; i < cnt; i++) {
nl tmp = 1;
while (k >= (tmp * prime[i][0])) {
tmp *= prime[i][0];
prime[i][1] -= k / tmp;
}
}
for (nl i = 1; i < cnt; i++) {
nl tmp = 1;
while ((n - k) >= (tmp * prime[i][0])) {
tmp *= prime[i][0];
prime[i][1] -= (n - k) / tmp;
}
}
}
int main() {
cin >> n >> k;
is_prime();
get();
ans[1] = 1;
//for(int i=1;i<cnt;i++)cout<<prime[i][0]<<" "<<prime[i][1]<<endl;
for (nl i = 1; i < cnt; i++) {
for (nl j = 1; j <= prime[i][1]; j++) {
for (nl q = 1; q <= 340; q++) {
ans[q] *= prime[i][0];
}
for (nl q = 1; q <= 340; q++) {
if (ans[q] >= 10) {
ans[q + 1] += ans[q] / 10;
ans[q] %= 10;
}
}
}
}
int flag = 0;
for (nl i = 340; i > 0; i--) {
if (ans[i] != 0 || (ans[i] == 0 && flag == 1)) {
cout << ans[i];
flag = 1;
}
}
return 0;
}