【清华集训2016】如何优雅地求和

首先,这种形式肯定是把组合数消掉一点,然后后面再二项式定理处理一下。但是怎么搞呢?

开始尝试了拉格朗日插值,但是有一项非常毒瘤。(我甚至少抄一项推出了 \(O(n)\) 的式子……)

要消掉组合数一定是与阶乘有关的形式。连续点值启发着我们使用下降幂。众所周知,点值转下降幂系数只需要卷上一个 \(e^{-x}\) 即可。

这时候考虑只用式子里代入下降幂:

\[
\begin{align*}
& \sum_{k=0}^n k^{\underline{m}} \binom{n}{k} x^k \left( 1 - x \right) ^ {n - k} \=& \sum_{k=0}^n \frac{k!}{\left(k-m\right)!} \frac{n!}{k!\left(n-k\right)!} x^k \left( 1 - x \right) ^ {n - k} \=& \sum_{k=0}^n \frac{n!}{\left(n-m\right)!} \frac{\left(n - m\right)!}{\left(k-m\right)!\left(n-k\right)!} x^k \left( 1 - x \right) ^ {n - k} \=& n^{\underline{m}} x^m \sum_{k=0}^n \binom{n - m}{n-k} x^{k-m} \left( 1 - x \right) ^ {n - k} \=& n^{\underline{m}} x^m \sum_{k=0}^n \left(1 - x + x\right) ^ {n - m} \=& n^{\underline{m}} x^m
\end{align*}
\]

容易计算。所以瓶颈就在转下降幂。如果实现好的话 \(O(n^2)\) 也是可以的。

#include <bits/stdc++.h>

const int mod = 998244353;
const int MAXN = 20010;
typedef long long LL;
void reduce(int & x) { x += x >> 31 & mod; }
int mul(int a, int b) { return (LL) a * b % mod; }
int fastpow(int a, int b) {
    int res = 1; a %= mod;
    for (; b; b >>= 1, a = mul(a, a)) if (b & 1) res = mul(res, a);
    return res;
}
int A[MAXN], inv[MAXN], fac[MAXN], B[MAXN];
int n, m, X;
int inv2[MAXN];
int main() {
    inv[0] = inv[1] = fac[0] = fac[1] = 1;
    for (int i = 2; i != MAXN; ++i) {
        fac[i] = mul(fac[i - 1], i);
        inv[i] = mul(inv[mod % i], mod - mod / i);
    }
    inv2[0] = 1, inv2[1] = mod - 1;
    for (int i = 2; i != MAXN; ++i) {
        inv[i] = mul(inv[i - 1], inv[i]);
        reduce(inv2[i] = i & 1 ? mod - inv[i] : inv[i]);
    }
    std::cin >> n >> m >> X; ++m;
    for (int i = 0; i < m; ++i) std::cin >> A[i], A[i] = mul(A[i], inv[i]);
    for (int i = 0, t; i < m; ++i)
        for (int j = 0; i + j < m; ++j)
            reduce(B[i + j] += (LL) A[i] * inv2[j] % mod - mod);
    for (int i = 0; i < m; ++i) A[i] = mul(A[i], fac[i]);
    int now = 1, ans = 0;
    for (int i = 0; i < m; ++i) {
        reduce(ans += (LL) fastpow(X, i) * now % mod * B[i] % mod - mod);
        now = mul(now, n - i);
    }
    std::cout << ans << std::endl;
    return 0;
}

原文地址:https://www.cnblogs.com/daklqw/p/11623895.html

时间: 2024-10-19 01:57:47

【清华集训2016】如何优雅地求和的相关文章

【UOJ274】【清华集训2016】温暖会指引我们前行 LCT

[UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低. 小R的宿舍楼中有n个地点和一些路,一条路连接了两个地点,小R可以通过这条路从其中任意一个地点到达另外一个地点.但在刚开始,小R还不熟悉宿舍楼中的任何一条路,所以他会慢慢地发现这些路,他在发现一条路时还会知道这条路的温度和长度.每条路的温度都是互不相同的. 小R需要在宿舍楼中活动,每次他都需要从

bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct

[清华集训2016]温暖会指引我们前行 统计 描述 提交 自定义测试 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一位火焰之神 “我将赐予你们温暖和希望!” 只见他的身体中喷射出火焰之力 通过坚固的钢铁,传遍了千家万户 这时,只听见人们欢呼 “暖气来啦!” 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低. 小R的

uoj#269. 【清华集训2016】如何优雅地求和(数论)

传送门 首先,如果\(f(x)=1\),那么根据二项式定理,有\(Q(f,n,k)=1\) 当\(f(x)=x\)的时候,有\[Q=\sum_{i=0}^ni\times \frac{n!}{i!(n-i)!}k^i(1-k)^{n-i}\] \[Q=\sum_{i=0}^nnk\times \frac{(n-1)!}{(i-1)!(n-i)!}k^{i-1}(1-k)^{n-i}\] \[Q=nk\sum_{i=0}^n\frac{(n-1)!}{(i-1)!(n-i)!}k^{i-1}(1-

【UOJ269】【清华集训2016】如何优雅地求和

题目大意 求 \[ \sum_{i=0}^n f(i){n\choose i} x^i (1-x)^{n-i} \] 模\(998244353\) \(n\leq 10^9,m\leq 2*10^4\) 题解 式子后面长得很像二项式定理,我们要想办法把\(f(i)\)分离出来. 一种高妙的做法是把\(f\)转成下降幂形式.可能是我做题太少没见过吧 令 \[ f(x)=\sum_{i=0}^m g_i x^{\underline{i}} \] 则 \[ \begin{aligned} ans&=\

UOJ 274 【清华集训2016】温暖会指引我们前行 ——Link-Cut Tree

魔法森林高清重置, 只需要维护关于t的最大生成树,然后链上边权求和即可. 直接上LCT 调了将近2h 吃枣药丸 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<=k;++i) #define D(i,j,k) for (int i=j;i&g

[BZOJ4730][清华集训2016][UOJ266] Alice和Bob又在玩游戏

题意:俩智障又在玩游戏.规则如下: 给定n个点,m条无向边(m<=n-1),保证无环,对于每一个联通块,编号最小的为它们的根(也就是形成了一片这样的森林),每次可以选择一个点,将其本身与其祖先全部删除,不能操作者输.判断先手胜负. 题解:比较神的一道题. 我们现在要解决的问题是怎么求解一棵子树的SG值,首先把根删掉的情况考虑,这很好办,直接把子树的sg异或起来就好,关键是如果删除点在子树里怎么办. 这里用到了一个巧妙的东西,trie.怎么会用这个呢?因为删除子树里的节点就相当于是子树里这种对应的

【UOJ】#273. 【清华集训2016】你的生命已如风中残烛

题目链接:http://uoj.ac/problem/273 $${Ans=\frac{\prod _{i=1}^{m}i}{w-n+1}}$$ 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 #include<cstdlib> 6 #include<cmath> 7 #include<cstring> 8

【20161203-20161208】清华集训2016滚粗记&amp;&amp;酱油记&amp;&amp;游记

先挖坑(这个blog怎么变成游记专用了--) #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/wangyurzee7/"); puts("谢谢您的配合"); puts("by wangyurzee7"); return 0; }

UOJ268 [清华集训2016] 数据交互 【动态DP】【堆】【树链剖分】【线段树】

题目分析: 不难发现可以用动态DP做. 题目相当于是要我求一条路径,所有与路径有交的链的代价加入进去,要求代价最大. 我们把链的代价分成两个部分:一部分将代价加入$LCA$之中,用$g$数组保存:另一部分将代价加在整条链上,用$d$数组保存. 这时候我们可以发现,一条从$u$到$v$的路径的代价相当于是$d[LCA(u,v)]+\sum_{x \in edge(u,v)}g[x]$. 如果是静态的,可以用树形DP解决. 看过<神奇的子图>的同学都知道,叶子结点是从它的儿子中取两个最大的出来,所