首页 > 其他分享 >P6031 CF1278F Cards 加强版

P6031 CF1278F Cards 加强版

时间:2023-03-22 22:15:48浏览次数:46  
标签:begin frac dbinom sum P6031 end Bmatrix Cards CF1278F

\(\text{Solution}\)

推式子
有答案为

\[\begin{aligned} Ans &=\sum_{i=0}^n i^k\dbinom n i (\frac 1 m)^i (1-\frac 1 m)^{n-i} \end{aligned} \]

\(i\) 的上限为 \(n\),交换求和顺序不好优化,看到 \(i^k\),试试第二类斯特林数

\[\sum_{i=0}^n i^k\dbinom n i (\frac 1 m)^i (1-\frac 1 m)^{n-i} = \sum_{i=0}^n \dbinom n i (\frac 1 m)^i (1-\frac 1 m)^{n-i} \sum_{j=0}^k \begin{Bmatrix}k\\j \end{Bmatrix}j! \dbinom i j \]

第二个求和符号后面只有 \(\dbinom i j\) 受 \(i\) 限制,而前面有 \(\dbinom n i\),考虑恒等式(组合意义即可)

\[\dbinom n i \dbinom i j = \dbinom n j \dbinom{n-j}{i-j} =\dbinom n j \dbinom{n-j}{n-i} \]

代回原式即可把后一部分提前

\[\begin{aligned} \sum_{i=0}^n \dbinom n i (\frac 1 m)^i (1-\frac 1 m)^{n-i} \sum_{j=0}^k \begin{Bmatrix}k\\j \end{Bmatrix}j! \dbinom i j &= \sum_{j=0}^k \begin{Bmatrix}k\\j \end{Bmatrix}j! \dbinom n j\sum_{i=j}^n \dbinom{n-j}{i-j} (\frac 1 m)^i (1-\frac 1 m)^{n-i} \\ &= \sum_{j=0}^k \begin{Bmatrix}k\\j \end{Bmatrix}j! \dbinom n j\sum_{i=0}^{n-j} \dbinom{n-j}i (\frac 1 m)^{i+j} (1-\frac 1 m)^{n-j-i} \\ &= \sum_{j=0}^k \begin{Bmatrix}k\\j \end{Bmatrix}j! \dbinom n j m^{-j} \end{aligned} \]

第二行把 \((i-j) \rightarrow i\),然后二项式定理合并了第二个求和式子
此时已经有了 \(O(k\log k)\) 的做法了,多项式卷积直接弄出 \(S_k\)

不过可以更优,上式瓶颈在 \(S_k\) 中,考虑用容斥把 \(S_k\) 拆开

\[\begin{Bmatrix}k\\j \end{Bmatrix}=\frac1{j!}\sum_{i=0}^j {(-1)}^j\dbinom j i (j-i)^k \]

那么

\[\begin{aligned} \sum_{j=0}^k \begin{Bmatrix}k\\j \end{Bmatrix}j! \dbinom n j m^{-j} &= \sum_{j=0}^k \dbinom n j m^{-j} \sum_{i=0}^j {(-1)}^j\dbinom j i (j-i)^k \\ &= \sum_{j=0}^k \dbinom n j m^{-j} \sum_{i=0}^j {(-1)}^{j-i}\dbinom j i i^k \\ &= \sum_{i=0}^k i^k (-1)^i \dbinom n i \sum_{j=i}^k \dbinom{n-i}{n-j} ({\frac 1 m})^j (-1)^j \end{aligned} \]

第二行同样是把 \((j-i)\rightarrow i\),然后出现的 \(\dbinom n j \dbinom j i\) 同样处理,并提前枚举 \(i\)
前一个求和可以线筛预处理 \(i^k\)
考虑后面的求和式子,记为 \(f(i)\),找到一种递推关系 \(O(k)\) 预处理
处理手段是把组合数按帕斯卡公式展开
那么

\[\begin{aligned} f(i)=\sum_{j=i}^k \dbinom{n-i}{n-j} ({\frac 1 m})^j (-1)^j &= f(i+1)+\sum_{j=i}^k \dbinom{n-i-1}{n-j-1} ({\frac 1 m})^j (-1)^j \\ &= f(i+1)+\sum_{j=i+1}^{k+1} \dbinom{n-i-1}{n-j} ({\frac 1 m})^{j-1} (-1)^{j-1}\\ &= (1-m)f(i+1) + \dbinom{n-i-1}{n-k-1} ({\frac 1 m})^k (-1)^k\\ \end{aligned} \]

第二行把 \((j+1)\rightarrow j\),然后单独提出 \(j=k+1\) 的式子,发现又出现了个 \(f(i+1)\)
于是可以 \(O(k)\) 递推了
恰当处理组合数即可

写到累死

\(\text{Code}\)

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int P = 998244353, N = 1e7 + 5;
LL n, m, K;
int sgn[2] = {1, P - 1};
int f[N], idk[N], inv[N], vis[N], pr[N / 5], tot;

void Add(int &x, int y){((x += y) >= P) && (x -= P);}
int fpow(int x, int y) {
    int s = 1;
    for(; y; y >>= 1, x = (LL)x * x % P) if (y & 1) s = (LL)s * x % P;
    return s;
}

void init() {
    inv[0] = inv[1] = idk[1] = 1;
    for(int i = 2; i <= K + 1; ++i) inv[i] = (LL)(P - P / i) * inv[P % i] % P;
    for(int i = 2; i <= K + 1; ++i) {
        if (!vis[i]) pr[++tot] = i, idk[i] = fpow(i, K);
        for(int j = 1; j <= tot && i * pr[j] <= N - 5; ++j) {
            vis[i * pr[j]] = 1, idk[i * pr[j]] = (LL)idk[i] * idk[pr[j]] % P;
            if (!(i % pr[j])) break;
        }
    }
}

int main() {
    scanf("%lld%lld%lld", &n, &m, &K), init();
    int invm = fpow(m, P - 2), c = 1;
    f[K] = (LL)fpow(invm, K) * sgn[K & 1] % P;
    for(int i = K - 1; i; --i) {
        c = (LL)c * (n - i - 1 + P) % P * inv[K - i] % P;
        f[i] = (LL)f[i + 1] * (1LL - m + P) % P;
        Add(f[i], (LL)f[K] * c % P);
    }
    c = 1; int ans = 0;
    for(int i = 1; i <= K; ++i) {
        c = (LL)c * (n - i + 1) % P * inv[i] % P;
        Add(ans, (LL)idk[i] * sgn[i & 1] % P * c % P * f[i] % P);
    }
    printf("%d\n", ans);
}

标签:begin,frac,dbinom,sum,P6031,end,Bmatrix,Cards,CF1278F
From: https://www.cnblogs.com/leiyuanze/p/17245647.html

相关文章

  • 题解 ARC111B【Reversible Cards】
    我们将值域中每个数视作一个节点,将每张卡片视作连接两个节点的边,则问题转化为:对于每条边都选择一个端点,使得被选择的节点总数最大。显然每个连通块可以分开处理。设连通块......
  • ABC 291 D - Flip Cards(状态机)
    https://atcoder.jp/contests/abc291/tasks/abc291_d题目大意:n张卡片排成一行。每张卡片正面是数字ai,背面是数字bi。最初,所有的牌都处于正面状态。随机翻转>=0张卡片......
  • 「CF1392H」ZS Shuffles Cards
    题目点这里看题目。你有\(n+m\)张牌,其中有恰好\(n\)张为数字牌,分别标有\(1,2,3,\dots,n\),剩下的恰好\(m\)张均为鬼牌。一开始,牌被随机打乱,同时你有一个集合\(......
  • B - Reversible Cards(树与图的基础)
    题目https://atcoder.jp/contests/arc111/tasks/arc111_b题意输入n(≤2e5)和一个n行2列的矩阵,矩阵元素范围[1,4e5]从每行中恰好选一个数,最多能选出多少个不......
  • Codeforces 1278 F Cards 增强版 题解 (斯特林数,推式子)
    原题链接增强版链接增强版中k=1e7为啥网上题解的式子都那么长啊.jpg首先令\(p=\frac1m\)。求某个数的次幂的题通常都是无脑转下降幂:\(x^k=\sum_{i=0}^kS_2(k,i)x^{\u......
  • ABC247F Cards 题解
    ABC247FCardsSolution目录ABC247FCardsSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定$n$张卡片,每张卡片正反面各有一个......
  • Codeforces Global Round 10 H. ZS Shuffles Cards
    题目链接设f[i]表示还有i个数不在集合内的期望步数,尝试列一下转移式,会发现式子由转移到下一轮的期望步数和之后的DP值组成,考虑DP的转移过程,就会发现答案为转移到下一轮的......
  • 卡片游戏(Throwing cards away I)
    ProblemB:ThrowingcardsawayIGivenisanordereddeckofncardsnumbered1tonwithcard1atthetopandcardnatthebottom.Thefollowingoperationi......
  • CF1539E Game with Cards
    把最终答案看成一段\(0\),一段\(1\)的一个串。如果说我们的答案中有一段\(0\)(\(1\)同理)。那么所有\(0\)的数都满足所有第一个范围,这段\(0\)前面的\(1\)代......
  • CF1392H ZS Shuffles Cards 题解
    linkDescription有\(n\)张数字牌以及\(m\)张鬼牌,有一个不可重集合\(S\),初始为空。不断执行以下操作:抽出一张牌,如果为数字牌,则加入\(S\)并移除。如果为鬼牌,如果......