📅  最后修改于: 2023-12-03 14:57:35.190000             🧑  作者: Mango
该表达式表示将 $N$ 个数按照给定顺序相乘然后取模,其中 $N1$ 等于 $N$, $N2$ 等于 $N-1$,以此类推,直到 $N$ 个数全部相乘,最终结果取模 $109 + 7$。
在高精度计算的基础上,可以使用循环计算每个 $Ni$ 并相乘,最后取模。算法时间复杂度为 $O(NlogN)$。
以下是C++代码片段:
const int MOD = 1e9 + 7;
vector<int> mul(vector<int> A, int b) {
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i++) {
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
return C;
}
int main() {
int n;
cin >> n;
vector<int> ans;
ans.push_back(1);
for (int i = 1; i <= n; i++) {
ans = mul(ans, i);
}
int res = 0;
for (int i = 0; i < ans.size(); i++) {
res = (res * 10 + ans[i]) % MOD;
}
printf("%d\n", res);
return 0;
}
该表达式很常见,可以用于计算由 $N$ 个数产生的排列组合数。在实践中,需要注意选用合适的数据类型和取模方式以保证精度和避免溢出。