📜  计算表达式(N1 *(N – 1)2 *…* 1N)%(109 + 7)(1)

📅  最后修改于: 2023-12-03 14:57:35.190000             🧑  作者: Mango

计算表达式(N1 *(N – 1)2 1N)%(109 + 7)

简介

该表达式表示将 $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$ 个数产生的排列组合数。在实践中,需要注意选用合适的数据类型和取模方式以保证精度和避免溢出。