1 条题解

  • 0
    @ 2023-5-2 8:37:07
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    const int MOD = 1000000000 + 7;
    const int MAXN = 1000000; // MAXM=MAXN
    int fact[MAXN + 5];
    int factInv[MAXN + 5]; // (i!)^{-1}
    // n 个元素错位排列数
    // n! * SUM{k=0~n}((-1)^k/k!)
    int d[MAXN + 5];
    // a^b (mod p)
    long long quick_pow(long long a, long long b, long long p)
    {
        long long res = 1;
        while (b)
        {
            if (b & 1)
                res = (res * a) % p;
            b = b >> 1;
            a = (a * a) % p;
        }
        return res;
    }
    // 求 x 在模 p 意义下的逆元
    int inv(int x, int p)
    {
        return quick_pow(x, p - 2, p);
    }
    // 计算fact、inv、d
    void init()
    {
        fact[0] = 1;
        for (int i = 1; i <= MAXN; i++)
            fact[i] = fact[i - 1] * i % MOD;
        for (int i = 0; i <= MAXN; i++)
            factInv[i] = inv(fact[i], MOD);
        d[0] = 1;
        d[1] = 0;
        for (int i = 2; i <= 1000000; i++)
            d[i] = (i - 1) * (d[i - 1] + d[i - 2]) % MOD;
    }
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int T;
        cin >> T;
        init();
        while (T--)
        {
            int n, m;
            cin >> n >> m;
            // 选m个位置固定 C(n,m) = n!/(m!(n-m)!)
            // 剩下的 n-m 个位置错排 d[n-m]
            int ans = 1;
            ans = (ans * fact[n]) % MOD;
            ans = (ans * factInv[m]) % MOD;
            ans = (ans * factInv[n - m]) % MOD;
            ans = (ans * d[n - m]) % MOD;
            cout << ans << "\n";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1275
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    17
    已通过
    12
    上传者