• codeforces 1278F


    传送门

    解题过程:

    (答案=sum^n_{i=0}*C^i_n*{frac{1}{m}}^i*{frac{m-1}{m}}^{n-i}*i^k)
    根据第二类斯特林数的性质(n^k=sum^k_{i=0}S^i_k*i!*C^i_n=sum^k_{i=0}S^i_k*n^underline{i})将普通幂转为下降幂
    (=sum^n_{i=0}C^i_n*{frac{1}{m}}^i*{frac{m-1}{m}}^{n-i}sum^k_{j=0}S^j_k*i^underline{j})
    (=sum^k_{j=0}S^j_ksum^n_{i=0}C^i_n{frac{1}{m}}^i{frac{m-1}{m}}^{n-i}i^underline{j})
    (C^i_n)化出来就是(frac{n!}{(n-i)!i!})
    所以(frac{n!}{(n-i)!i!}i^underline{j}=frac{n!}{(n-i)!(i-j)!}=frac{(n-j)!n^underline{j}}{(n-i)!(i-j)!}=C^{i-j}_{n-j}n^underline{j})
    答案(=sum^k_{j=0}S^j_kn^underline{j}sum^n_{i=j}C^{i-j}_{n-j}*{frac{1}{m}}^i*{frac{m-1}{m}}^{n-i})
    通过变换积分上下限有
    (=sum^k_{j=0}S^j_kn^underline{j}{frac{1}{m}}^{j}sum^{n-j}_{i=0}C^{i}_{n-j}*{frac{1}{m}}^i*{frac{m-1}{m}}^{n-i-j})
    (=sum^k_{j=0}S^j_kn^underline{j}{frac{1}{m}}^{j})
    (n^2)预处理第二类斯特林数,其他的可以过程中求

    #include <bits/stdc++.h>
    using namespace std;
    /*    freopen("k.in", "r", stdin);
        freopen("k.out", "w", stdout); */
    // clock_t c1 = clock();
    // std::cerr << "Time:" << clock() - c1 <<"ms" << std::endl;
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #define de(a) cout << #a << " = " << a << endl
    #define rep(i, a, n) for (int i = a; i <= n; i++)
    #define per(i, a, n) for (int i = n; i >= a; i--)
    #define ls ((x) << 1)
    #define rs ((x) << 1 | 1)
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int, int> PII;
    typedef pair<double, double> PDD;
    typedef pair<ll, ll> PLL;
    typedef vector<int, int> VII;
    #define inf 0x3f3f3f3f
    const ll INF = 0x3f3f3f3f3f3f3f3f;
    const ll MAXN = 5e5 + 7;
    const ll MAXM = 1e5 + 7;
    const ll MOD = 998244353;
    const double eps = 1e-6;
    const double pi = acos(-1.0);
    ll quick_pow(ll a, ll b)
    {
        ll ans = 1;
        while (b)
        {
            if (b & 1)
                ans = (1LL * ans * a) % MOD;
            a = (1LL * a * a) % MOD;
            b >>= 1;
        }
        return ans;
    }
    ll s[5005][5005];
    void go()
    {
        s[0][0] = 1;
        for (int i = 1; i <= 5000; i++)
            for (int j = 1; j <= i; j++)
                s[i][j] = (s[i - 1][j - 1] + j * s[i - 1][j]) % MOD;
    }
    int main()
    {
        ll n, m, k;
        go();
        scanf("%lld%lld%lld", &n, &m, &k);
        ll inv = quick_pow(m, MOD - 2);
        ll ans = 0;
        ll up = 1;
        for (int i = 1; i <= k; i++)
        {
            (((up *= (n - i + 1)) %= MOD) *= inv) %= MOD;
            (ans += s[k][i] * up) %= MOD;
        }
        printf("%lld
    ", ans);
        return 0;
    }
    
  • 相关阅读:
    JDK和TOMCAT环境变量配置
    MEF(Managed Extensibility Framework )的入门介绍
    这样的数据导出你知道?
    ListBox实现拖拽排序功能
    各种技术资源汇总
    大话数据结构-排序
    大话数据结构-查找
    CheckListBox的实现方式分析
    listbox里面添加WrapPanel ,支持自适应换行
    RESTful 接口实现简明指南
  • 原文地址:https://www.cnblogs.com/graytido/p/12213765.html
Copyright © 2020-2023  润新知