ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF932E Team Work

2020-12-29 08:34:02  阅读:228  来源: 互联网

标签:sum Work Team binom include brace ll CF932E MOD


CF932E Team Work

讲道理不难,但是我推不出来(指在模数为998244353的情况下的 \(O(k)\) 做法)我只能搞出 \(O (K \log N)\) 的,但是需要模数为998244353(你要用FFT也行,不保证精度)。

那么考虑 \(O(K^2)\)。显然,你只需要 这题 就行了。 (推导过程容易发现 \(j \gt k\) 和 \(j=0\) 时,值为0。

\[\sum_{i=1}^n \binom n i i^k \\ = \sum_{i=1}^n \binom n i \sum_{j=0}^i {k\brace j}j! \binom i j \\ = \sum_{j=1}^k {k \brace j} j! \sum_{i=j}^n \binom n i \binom i j\\ = \sum_{j=1}^k {k \brace j} j! \sum_{i=j}^n \binom n j \binom {n-j} {i-j} \\ = \sum_{j=1}^k {k \brace j} j! \binom n j \sum_{i=j}^n \binom {n-j} {i-j} \\ = \sum_{j=1}^k {k \brace j} j! \binom n j 2^{n-j} \]

这题就可以 \(O(K^2)\) 完成了。但是我们怎么可以放弃(大雾),我们已知

\[{n \brace k}\\ = \frac{1}{k!} \sum_{i=0}^k (-1)^i \binom ki (k-i)^n \\ = \sum_{i=0}^k \frac{(-1)^i}{i!} \frac {(k-i)^n} {(k-i)!} \]

那么我们可以直接卷一下就变成 \(O (K \log N)\) 了(模数998244353)。

\(O(K)\) 做法请去看min_25博客

/*
    Name:
    Author: Gensokyo_Alice
    Date:
    Description:
*/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <ctime>
#include <stack>
#include <queue>
#include <set>
#include <map>

using namespace std;

typedef long long ll;
const ll MAXN = (1LL << 20) + 10, MOD = 1e9+7, INF = 0x3f3f3f3f3f3f3f3f;

ll N, K, ans, fac[MAXN], inv[MAXN];

ll ks(ll, ll); 

namespace subtask2 {
    ll str[MAXN];
    void work() {
        str[1] = 1;
        for (ll i = 2; i <= K; i++)
            for (ll j = i; j >= 1; j--)
                str[j] = (str[j-1] + (j * str[j] % MOD)) % MOD;
        ll now = 1;
        for (ll j = 1; j <= K; j++) {
            ll invnow = inv[j] * fac[j-1] % MOD;
            now = now * (N-j+1) % MOD * invnow % MOD;
            (ans += str[j] * fac[j] % MOD * now % MOD * ks(2, N-j) % MOD) %= MOD;
        }
        printf("%lld\n", ans);
    }
}

int main() {
    scanf("%lld%lld", &N, &K); inv[0] = inv[1] = fac[1] = fac[0] = 1;
    for (ll i = 2; i <= K; i++) fac[i] = fac[i-1] * i % MOD, inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD;
    for (ll i = 1; i <= K; i++) inv[i] = inv[i-1] * inv[i] % MOD;
    if (K <= 5000) {
        subtask2::work();
        return 0;
    }
    return 0;
}

ll ks(ll n, ll tim) {
	bool flag = 0;
	if (tim < 0) tim = -tim, flag = 1;
    ll ret = 1;
    while (tim) {
        if (tim & 1) ret = ret * n % MOD;
        n = n * n % MOD;
        tim >>= 1;
    }
    if (flag) return ks(ret, MOD - 2);
    return ret;
}

标签:sum,Work,Team,binom,include,brace,ll,CF932E,MOD
来源: https://www.cnblogs.com/Gensokyo-Alice/p/14204631.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有