1 solutions

  • 1
    @ 2024-12-12 12:39:38

    这题数据量达到了1e18 所以开始考虑数学解法 对于1~k而言其实是选出一个无向无环联通图,也就是无根树,再对其随便选一个根 用Cayley公式计算为:

    T(Kn)=kk2 T(K_n) = k^{k-2}

    再乘上个k(所有节点都可为根):

    kk1 k^{k-1}

    而对于后半段n - k各节点就不做要求了, 所以是:

    (nk)nk(n - k)^{n-k}

    于是答案浮出水面:

    ans=(nk)nkkk1ans = (n - k)^{n - k} * k^{k-1}

    因为数据量很大,所以用快速幂算法:

    #include <bits/stdc++.h>
    using namespace std;
    
    long long myPow(long long mod, long long x, long long n) {
        long long res = 1;
        x %= mod;
        if (n < 0) {
            n = -n;
            x = 1 / x;
        }
        while (n) {
            if (n & 1) {
                res *= x;
                res %= mod;
            }
            x *= x;
            x %= mod;
            n >>= 1;
        }
        return res;
    }
    
    int main() {
        long long n, k, mod = 1e9 + 7;
        cin >> n >> k;
        long long ans = (myPow(mod, k, k - 1) * myPow(mod, n - k, n - k));
        ans %= mod;
        cout << ans;
        return 0;
    }
    
    • 1

    Information

    ID
    9367
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    10
    Tags
    # Submissions
    2
    Accepted
    1
    Uploaded By