1 条题解

  • 0
    @ 2026-3-12 20:18:50
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int MOD = 1e9 + 7;
    const int MAXN = 1e6 + 5;
    
    ll fact[MAXN];      // 阶乘
    ll inv_fact[MAXN]; // 阶乘逆元
    ll D[MAXN];        // 错排数
    
    ll qpow(ll a, ll b) {
        ll res = 1;
        while (b) {
            if (b & 1) res = res * a % MOD;
            a = a * a % MOD;
            b >>= 1;
        }
        return res;
    }
    
    void init() {
        // 阶乘
        fact[0] = 1;
        for (int i = 1; i < MAXN; i++) {
            fact[i] = fact[i - 1] * i % MOD;
        }
        
        // 阶乘逆元
        inv_fact[MAXN - 1] = qpow(fact[MAXN - 1], MOD - 2);
        for (int i = MAXN - 2; i >= 0; i--) {
            inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD;
        }
        
        // 错排数
        D[0] = 1;
        D[1] = 0;
        for (int i = 2; i < MAXN; i++) {
            D[i] = (i - 1) * (D[i - 1] + D[i - 2]) % MOD;
        }
    }
    
    ll C(int n, int m) {
        if (m < 0 || m > n) return 0;
        return fact[n] * inv_fact[m] % MOD * inv_fact[n - m] % MOD;
    }
    
    int main() {
        init();
        int T;
        scanf("%d", &T);
        while (T--) {
            int n, m;
            scanf("%d%d", &n, &m);
            if (m > n) {
                printf("0\n");
                continue;
            }
            ll ans = C(n, m) * D[n - m] % MOD;
            printf("%lld\n", ans);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    141
    时间
    1000ms
    内存
    128MiB
    难度
    9
    标签
    递交数
    11
    已通过
    3
    上传者