https://www.luogu.com.cn/problem/P1358
避个坑:在用乘除法求组合数并且要取模运算时,分子算完取模,除分母取模可能会出现分子除不尽分母;所以代码改进当要除不尽时,给分子加上取模的值,直到它可以除尽分母为止;
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include<unordered_map>
using namespace std;
string s;
int m, n, ans, b, t;
const int p = 10007;
int C(int m, int n)
{
int k = 1, d = 1;
//for (int i = 0; i < n; ++i) {//错误代码
// d *= (i + 1);
// d %= p;
// k *= (m - i);
// k %= p;
//}
//return (k/d);
int sum = 1;
for (int i = 1; i <= n; i++)
sum = (sum * (m - i + 1)) % 10007;
for (int i = 1; i <= n; i++)
{
while (sum % i != 0)sum += 10007;//*****正确代码;;
sum /= i;
}
return sum;
}
int main()
{
int cnt = 0;
cin >> m >> n;
int a[10005];
for (int i = 0; i < n; ++i) {
cin >> a[i];
cnt += a[i];
}
if (cnt > m) {
cout << 0;
return 0;
}
ans = 1;
for (int i = 0; i < n; ++i) {
ans *= C(m,a[i]);
m -= a[i];
ans %= p;
}
cout << ans;
return 0;
}