[洛谷P4705]玩游戏
题目大意:对于每个$k\in[1,t]$,求:
$$
\dfrac{\sum\limits_{i=1}^n\sum\limits_{j=1}^m(a_i+b_j)^k}{nm}
$$
$n,m,t\leqslant10^5$
题解:发现这个$nm$是一个定值,可以先不考虑,先对每一个$k$来求
$$
\begin{align*}
&\sum\limits_{i=1}^n\sum\limits_{j=1}^m(a_i+b_j)^k\\
=&\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{s=0}^k\binom ksa_i^sb_j^{k-s}\\
=&\sum\limits_{s=0}^k\binom ks\sum\limits_{i=1}^na_i^s\sum\limits_{j=1}^mb_j^{k-s}\\
=&\sum\limits_{s=0}^k\dfrac{k!}{s!(k-s!)}\sum\limits_{i=1}^na_i^s\sum\limits_{j=1}^mb_j^{k-s}\\
=&k!\sum\limits_{s=0}^k\sum\limits_{i=1}^n\dfrac{a_i^s}{s!}\sum\limits_{j=1}^m\dfrac{b_j^{k-s}}{(k-s)!}\\
\end{align*}
$$
令$A_k=\sum\limits_{i=0}^n\dfrac{a_i^k}{k!},B_k=\sum\limits_{i=0}^m\dfrac{b_i^k}{k!}$式子就变成了
$$
k!\sum\limits_{s=0}^kA_sB_{k-s}\\
$$
就可以很简单的求出来了,现在的问题变成了如何求$A,B$。接下来就讲求$A$的方法,$B$的相同。
令$A(x)$为$A$的生成函数,即$A(x)=\sum\limits_{k=0}^{\infty}\dfrac{\sum\limits_{i=0}^na_i^k}{k!}x^k$,这一个$k!$也很好解决,下面就省略不写
$$
\begin{align*}
f(x)=&\sum\limits_{k=0}^{\infty}\sum\limits_{i=0}^na_i^kx^k\\
=&\sum\limits_{i=0}^n\sum\limits_{k=0}^{\infty}a_i^kx^k\\
=&\sum\limits_{i=0}^n\dfrac1{1-a_i}
\end{align*}
$$
发现$\ln'(x)=\dfrac1x,\ln'(1-ax)=\dfrac{-a_i}{1-a_i}$
令$g(x)=\sum\limits_{i=0}^n\dfrac{-a_i}{1-a_i}$,然后$f(x)=-g(x)x+n$,而$g(x)$可以比较简单的求出来:
$$
\begin{align*}
g(x)=&\sum\limits_{i=0}^n\dfrac{-a_i}{1-a_i}\\
=&\sum\limits_{i=0}^n\ln'(1-a_ix)\\
=&\ln'(\prod\limits_{i=1}^n(1-a_ix))
\end{align*}
$$
令$M(x)=\prod\limits_{i=1}^n(1-a_ix)$,这可以用分治$FFT$求出
$$
\begin{align*}
g(x)=&\ln'(M(x))\\
=&(\int\dfrac{M'(x)}{M(x)})'\\
=&\dfrac{M'(x)}{M(X)}
\end{align*}
$$
然后把$g(x)$转成$f(x)$,再变成指数型生成函数卷一下就好了,注意别忘记上面省略掉的一些东西
卡点:求导写挂,一处地方不开$C++11$毁青春
C++ Code:
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
#define maxn 262144
const int mod = 998244353; #define mul(x, y) static_cast<long long> (x) * (y) % mod namespace Math {
inline int pw(int base, int p) {
static int res;
for (res = 1; p; p >>= 1, base = mul(base, base)) if (p & 1) res = mul(res, base);
return res;
}
inline int inv(int x) { return pw(x, mod - 2); }
}
inline void reduce(int &x) { x += x >> 31 & mod; }
inline void clear(register int *l, const int *r) {
if (l >= r) return ;
while (l != r) *l++ = 0;
} int inv[maxn], ifac[maxn], fac[maxn];
int A[maxn], B[maxn];
namespace Poly {
#define N maxn
int lim, s, rev[N], Wn[N];
inline void init(const int n) {
lim = 1, s = -1; while (lim < n) lim <<= 1, ++s;
for (register int i = 1; i < lim; ++i) rev[i] = rev[i >> 1] >> 1 | (i & 1) << s;
const int t = Math::pw(3, (mod - 1) / lim);
*Wn = 1; for (register int *i = Wn + 1; i != Wn + lim; ++i) *i = mul(*(i - 1), t);
}
inline void FFT(int *A, const int op = 1) {
for (register int i = 1; i < lim; ++i) if (i < rev[i]) std::swap(A[i], A[rev[i]]);
for (register int mid = 1; mid < lim; mid <<= 1) {
const int t = lim / mid >> 1;
for (register int i = 0; i < lim; i += mid << 1)
for (register int j = 0; j < mid; ++j) {
const int X = A[i + j], Y = mul(A[i + j + mid], Wn[t * j]);
reduce(A[i + j] += Y - mod), reduce(A[i + j + mid] = X - Y);
}
}
if (!op) {
const int ilim = Math::inv(lim);
for (register int *i = A; i != A + lim; ++i) *i = mul(*i, ilim);
std::reverse(A + 1, A + lim);
}
} std::vector<int> P1[maxn], P2[maxn];
#define __DC_FFT(x, A) \
void DC_FFT##x(int rt, int l, int r) { \
if (l == r) { \
P##x[rt] = {1, A[l]}; \
return ; \
} \
static int C[N], D[N]; \
const int mid = l + r >> 1, L = rt << 1, R = rt << 1 | 1; \
DC_FFT##x(L, l, mid), DC_FFT##x(R, mid + 1, r); \
const int n = P##x[L].size(), m = P##x[R].size(); \
init(n + m); \
std::copy(P##x[L].begin(), P##x[L].end(), C), clear(C + n, C + lim); \
std::copy(P##x[R].begin(), P##x[R].end(), D), clear(D + m, D + lim); \
FFT(C), FFT(D); \
for (int i = 0; i < lim; ++i) C[i] = mul(C[i], D[i]); \
FFT(C, 0); \
P##x[rt].assign(C, C + n + m - 1); \
}
__DC_FFT(1, A)
__DC_FFT(2, B) inline void DER(int *A, int *B, int n) {
B[n - 1] = 0; for (int i = 1; i < n; ++i) B[i - 1] = mul(A[i], i);
} void INV(int *A, int *B, int n) {
if (n == 1) { *B = Math::inv(*A); return ; }
static int C[N], D[N];
const int len = n + 1 >> 1;
INV(A, B, len), init(len * 3);
std::copy(A, A + n, C), clear(C + n, C + lim);
std::copy(B, B + len, D), clear(D + len, D + lim);
FFT(C), FFT(D);
for (int i = 0; i < lim; ++i) D[i] = (2 - mul(C[i], D[i]) + mod) * D[i] % mod;
FFT(D, 0); std::copy(D + len, D + n, B + len);
} void solve(std::vector<int> P, int *A, int t) {
static int B[N], C[N];
const int n = P.size();
std::copy(P.begin(), P.end(), A); clear(A + n, A + t);
DER(A, B, n), INV(A, C, t);
init(n + t);
clear(B + n, B + lim), clear(C + t, C + lim);
FFT(B), FFT(C);
for (int i = 0; i < lim; ++i) A[i] = mul(B[i], C[i]);
FFT(A, 0);
for (int i = t; i; --i) reduce(A[i] = -A[i - 1]);
A[0] = n - 1;
for (int i = 0; i < t; ++i) A[i] = mul(A[i], ifac[i]);
}
void TANG_Yx(int n, int m, int t) {
DC_FFT1(1, 0, n - 1), DC_FFT2(1, 0, m - 1);
static int A[N], B[N];
solve(P1[1], A, t), solve(P2[1], B, t);
init(t << 1);
clear(A + t, A + lim), clear(B + t, B + lim);
FFT(A), FFT(B);
for (int i = 0; i < lim; ++i) A[i] = mul(A[i], B[i]);
FFT(A, 0);
const int nm = mul(Math::inv(n), Math::inv(m));
for (int i = 1; i < t; ++i) printf("%lld\n", mul(A[i], fac[i]) * nm % mod);
}
#undef N
} int n, m, t;
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
inv[0] = inv[1] = ifac[0] = ifac[1] = fac[0] = fac[1] = 1;
for (int i = 2; i < maxn; ++i) {
inv[i] = mul(mod - mod / i, inv[mod % i]);
ifac[i] = mul(ifac[i - 1], inv[i]);
fac[i] = mul(fac[i - 1], i);
}
std::cin >> n >> m;
for (int i = 0; i < n; ++i) std::cin >> A[i], reduce(A[i] = -A[i]);
for (int i = 0; i < m; ++i) std::cin >> B[i], reduce(B[i] = -B[i]);
std::cin >> t; ++t;
Poly::TANG_Yx(n, m, t);
return 0;
}
[洛谷P4705]玩游戏的更多相关文章
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
- 洛谷P4705 玩游戏 [生成函数,NTT]
传送门 这是两个月之前写的题,但没写博客.现在回过头来看一下发现又不会了-- 还是要写博客加深记忆. 思路 显然期望可以算出总数再乘上\((nm)^{-1}\). 那么有 \[ \begin{alig ...
- 洛谷 P4705 玩游戏
题目分析 题目要求的是: \[ \sum_{i=1}^n\sum_{j=1}^m(a_i+b_j)^x(x\in [1,T]) \] 利用二项式定理化式子, \[ \begin{aligned} &a ...
- 洛谷P4705 玩游戏(生成函数+多项式运算)
题面 传送门 题解 妈呀这辣鸡题目调了我整整三天--最后发现竟然是因为分治\(NTT\)之后的多项式长度不是\(2\)的幂导致把多项式的值存下来的时候发生了一些玄学错误--玄学到了我\(WA\)的点全 ...
- 洛谷 P2197 nim游戏
洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...
- 洛谷 P1965 转圈游戏
洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...
- 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山
前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...
- $loj10156/$洛谷$2016$ 战略游戏 树形$DP$
洛谷loj Desription Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的方法.现在他有个问题. 现在他有座古城堡,古城堡的路形成一棵树.他要在这棵树的节点上放置最少数 ...
- 洛谷P1080 国王游戏 python解法 - 高精 贪心 排序
洛谷的题目实在是裹脚布 还编的像童话 这题要 "使得获得奖赏最多的大臣,所获奖赏尽可能的少." 看了半天都觉得不像人话 总算理解后 简单说题目的意思就是 根据既定的运算规则 如何排 ...
随机推荐
- tomcat 在liunx中shutdown后进程仍然存在的两种实用解决办法
方法一: 查找tomcat进程并kill ps -elf | grep ${ctompath} | grep -v grep | awk '{print $4}' | xargs kill -9 此处 ...
- 为什么HashMap桶(链表)的长度超过8会转换成红黑树?
百度了一下,感觉能说清楚的并不多,所以在此记录一下. 首先说一说转换为红黑树的必要性: 红黑树的插入.删除和遍历的最坏时间复杂度都是log(n), 因此,意外的情况或者恶意使用下导致hashCode( ...
- Cocos2d-x的跨平台原理
为了充分发挥硬件性能,手机游戏通常使用Native App开发模式,这就造成开发商要为iOS 和Android平台用户开发不同的应用,无论是产品迭代还是运行维护都非常麻烦.Cocos2d-x在iOS, ...
- Erlang数据类型的表示和实现(3)——列表
列表 Erlang 中的列表是通过链表实现的,表示列表的 Eterm 就是这个链表的起点.列表 Eterm 中除去 2 位标签 01 之外,剩下的高 62 位表示指向列表中第一个元素的指针的高 62 ...
- 第39次Scrum会议(12/5)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/12/5 11:35~11:57,总计22min.地点:东北师 ...
- 《Spring1之第七次站立会议》
<第七次站立会议> 昨天:我把自己项目工程里的服务器端界面进行了优化和完善. 今天:我查找了关于实现视频功能的相关代码. 遇到的问题:找到的都是基于C#的相关代码,很难找到用java实现的 ...
- Java每日学习笔记1
单选按钮 JRadioButton radioButton1 = new JRadioButton("Java");// 创建单选按钮 contentPane.add(radioB ...
- 项目冲刺Beta第一篇博客
Beta版本冲刺计划安排 1.当天站立式会议照片: 2.工作分工: 团队成员 分工 张洪滨060 排行榜界面美化 陈敬轩059 注册成功界面美化 黄兴067 登录界面美化 林国梽068 答题界 ...
- jquery 取消全选和全选功能 不全选
代码如下 function ckSelectAll() { if ($('#ckSelectAll').is(':checked') == true) { $("INPUT[name='ch ...
- centos7开机出现try again to boot into default maintenance give root password for maintenance
开启centos7出现下面两句话,然后直接输出root密码,就可以登录,但是登录后,发现一些文字显示出来的是乱码 try again to boot into default maintenanceg ...