\(\mathcal{Description}\)

  Link.

  给定 \(n\) 和 \(m\) 次多项式 \(f(x)\),求

\[\sum_{i=0}^n\binom{n}{i}f(i)\bmod998244353
\]

  \(m\le10^5\),\(m\le n\le 10^9\)。

\(\mathcal{Solution}\)

  推式子叭~

\[\begin{aligned}
\sum_{i=0}^n\binom{n}{i}f(i)&=\sum_{i=0}^ma_i\sum_{j=0}^n\binom{n}{i}j^i\\
&=\sum_{i=0}^ma_ii![x^i]\left(\sum_{j=0}^{+\infty}\frac{x^j}{j!}\sum_{k=0}^n\binom{n}{k}k^j\right)\\
&=\sum_{i=0}^ma_ii![x^i]\left(\sum_{k=0}^n\binom{n}{k}e^{kx}\right)\\
&=\sum_{i=0}^ma_ii![x^i](e^x+1)^n
\end{aligned}
\]

多项式全家桶算出 \((e^x+1)^n\) 即可,复杂度 \(\mathcal O(m\log m)\)。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <cmath>
#include <cstdio>
#include <algorithm> #define rep( i, l, r ) for ( int i = l, rpbound##i = r; i <= rpbound##i; ++i )
#define per( i, r, l ) for ( int i = r, rpbound##i = l; i >= rpbound##i; --i ) const int MOD = 998244353, MAXL = 1 << 18, MAXM = 1e5, INV2 = MOD + 1 >> 1;
int n, m, c[MAXM + 5], fac[MAXL + 5], ifac[MAXL + 5];
int F[MAXL + 5], G[MAXL + 5]; inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline int mul( const long long a, const int b ) { return int( a * b % MOD ); }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline int mpow( int a, int b ) {
int ret = 1;
for ( ; b; a = mul( a, a ), b >>= 1 ) ret = mul( ret, b & 1 ? a : 1 );
return ret;
} inline void init( const int len ) {
fac[0] = 1;
rep ( i, 1, len ) fac[i] = mul( i, fac[i - 1] );
ifac[len] = mpow( fac[len], MOD - 2 );
per ( i, len - 1, 0 ) ifac[i] = mul( i + 1, ifac[i + 1] );
} namespace PolyOper { const int MG = 3;
int inv[MAXL + 5], omega[19][MAXL + 5]; inline void init() {
inv[1] = 1;
rep ( i, 2, MAXL ) inv[i] = mul( MOD - MOD / i, inv[MOD % i] );
rep ( i, 0, 18 ) {
int* oi = omega[i];
oi[0] = 1;
int& o1 = oi[1] = mpow ( MG, MOD - 1 >> i >> 1 );
rep ( j, 2, ( 1 << i ) - 1 ) oi[j] = mul( oi[j - 1], o1 );
}
} inline void ntt( const int n, int* u, const int type ) {
static int rev[MAXL + 5];
int lgn = 1;
for ( ; 1 << lgn < n; ++lgn );
rep ( i, 1, n - 1 ) rev[i] = rev[i >> 1] >> 1 | ( i & 1 ) << lgn >> 1;
rep ( i, 1, n - 1 ) if ( i < rev[i] ) {
u[i] ^= u[rev[i]] ^= u[i] ^= u[rev[i]];
}
for ( int i = 0, stp = 1; stp < n; ++i, stp <<= 1 ) {
const int* oi = omega[i];
for ( int j = 0; j < n; j += stp << 1 ) {
rep ( k, j, j + stp - 1 ) {
int ev = u[k], ov = mul( oi[k - j], u[k + stp] );
u[k] = add( ev, ov ), u[k + stp] = sub( ev, ov );
}
}
}
if ( type == -1 ) {
for ( int invn = MOD - ( MOD - 1 ) / n, i = 0; i < n; ++i ) {
u[i] = mul( u[i], invn );
}
std::reverse( u + 1, u + n );
}
} inline void polyDir ( const int n, const int* u, int* w ) {
rep ( i, 1, n - 1 ) w[i - 1] = mul( i, u[i] );
w[n - 1] = 0;
} inline void polyInt( const int n, const int* u, int* w ) {
per ( i, n - 1, 0 ) w[i + 1] = mul( inv[i + 1], u[i] );
w[0] = 0;
} inline void polyInv( const int n, const int* u, int* w ) {
static int tmp[2][MAXL + 5];
if ( n == 1 ) return void( w[0] = mpow( u[0], MOD - 2 ) );
polyInv( n >> 1, u, w );
rep ( i, 0, n - 1 ) tmp[0][i] = u[i], tmp[1][i] = w[i];
ntt( n << 1, tmp[0], 1 ), ntt( n << 1, tmp[1], 1 );
rep ( i, 0, ( n << 1 ) - 1 ) {
tmp[0][i] = mul( mul( tmp[0][i], tmp[1][i] ), tmp[1][i] );
}
ntt( n << 1, tmp[0], -1 );
rep ( i, 0, n - 1 ) w[i] = sub( mul( 2, w[i] ), tmp[0][i] );
rep ( i, 0, ( n << 1 ) - 1 ) tmp[0][i] = tmp[1][i] = 0;
} inline void polyLn( const int n, const int* u, int* w ) {
static int tmp[2][MAXL + 5];
polyDir( n, u, tmp[0] ), polyInv( n, u, tmp[1] );
ntt( n << 1, tmp[0], 1 ), ntt( n << 1, tmp[1], 1 );
rep ( i, 0, ( n << 1 ) - 1 ) tmp[0][i] = mul( tmp[0][i], tmp[1][i] );
ntt( n << 1, tmp[0], -1 ), polyInt( n << 1, tmp[0], w );
rep ( i, 0, ( n << 1 ) - 1 ) tmp[0][i] = tmp[1][i] = 0;
} inline void polyExp ( const int n, const int* u, int* w ) {
static int tmp[MAXL + 5];
if ( n == 1 ) return void( w[0] = 1 );
polyExp( n >> 1, u, w ), polyLn( n, w, tmp );
tmp[0] = sub( add( u[0], 1 ), tmp[0] );
rep ( i, 1, n - 1 ) tmp[i] = sub( u[i], tmp[i] );
ntt( n << 1, tmp, 1 ), ntt( n << 1, w, 1 );
rep ( i, 0, ( n << 1 ) - 1 ) w[i] = mul( w[i], tmp[i] );
ntt( n << 1, w, -1 );
rep ( i, n, ( n << 1 ) - 1 ) w[i] = tmp[i] = 0;
} } // namespace PolyOper. int main () {
freopen( "number.in", "r", stdin );
freopen( "number.out", "w", stdout ); PolyOper::init();
scanf( "%d %d", &n, &m ), ++m;
rep ( i, 0, m - 1 ) scanf( "%d", &c[i] ); int len = 1;
for ( ; len < m; len <<= 1 );
init( len ), F[0] = 1;
rep ( i, 1, len - 1 ) F[i] = mul( ifac[i], INV2 ); PolyOper::polyLn( len, F, G );
rep ( i, 0, len - 1 ) G[i] = mul( G[i], n ), F[i] = 0;
PolyOper::polyExp( len, G, F ); int ans = 0;
rep ( i, 0, m - 1 ) ans = add( ans, mul( c[i], mul( fac[i], F[i] ) ) );
printf( "%d\n", mul( ans, mpow( 2, n ) ) );
return 0;
}

Solution -「多校联训」查拉图斯特拉如是说的更多相关文章

  1. Solution -「多校联训」数学考试

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个函数,第 \(i\) 个有 \(f_i(x)=a_ix^3+b_ix^2+cx_i+d~(x\in[l_i, ...

  2. Solution -「多校联训」排水系统

    \(\mathcal{Description}\)   Link.   在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...

  3. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  4. Solution -「多校联训」签到题

    \(\mathcal{Description}\)   Link.   给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...

  5. Solution -「多校联训」朝鲜时蔬

    \(\mathcal{Description}\)   Link.   破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面.   对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...

  6. Solution -「多校联训」消失的运算符

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\) 的合法表达式序列 \(s\),其中数字仅有一位正数,运算符仅有 - 作为占位.求将其中恰好 \(k\) ...

  7. Solution -「多校联训」假人

    \(\mathcal{Description}\)   Link.   一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...

  8. Solution -「多校联训」古老的序列问题

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...

  9. Solution -「多校联训」Sample

    \(\mathcal{Description}\)   Link   (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\ma ...

随机推荐

  1. Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】

    1.ArrayList (1)底层是由动态数组实现的[使用了List接口]. (2)动态数组是长度不固定,随着数据的增多而变长. (3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会 ...

  2. js 对 date 和 字符串 类型的正确互换【各浏览器兼容】,解决invalid Date

    1.前言 有个需求,想要把指定日期时间的字符串转换成date类型 pc浏览器正常转换,但手机浏览器 返回结果是 invalid Date [无效的日期] 2.原因 出现这样不兼容的原因其实很简单, p ...

  3. Linux内核模块学习

    注:本文是<Linux设备驱动开发详解:基于最新的Linux 4.0内核 by 宋宝华 >一书学习的笔记,大部分内容为书籍中的内容. 书籍可直接在微信读书中查看:Linux设备驱动开发详解 ...

  4. 【Spring专场】「MVC容器」不看源码就带你认识核心流程以及运作原理

    前提回顾 之前已经写了很多问斩针对于SpringMVC的的执行原理和核心流程,在此再进行冗余介绍就没有任何意义了,所以我们主要考虑的就是针对于SpringMVC还没但大框架有介绍的相关内容解析分析和说 ...

  5. 网络编程-HTTP cookie

    目录 1.cookie的起源 2.cookie是什么? 3.创建cookie 3.1.响应首部 Set-Cookie 3.2.请求首部 Cookie 3.3.Document.cookie 4.HTT ...

  6. 今日学习——蓝桥杯 2019年 C语言 B组

    1.手淦(亲身体验,,,没啥大用,最终还是代码) 2.代码(下面是我看其他博主代码答案能看的懂的....具体的可以直接去下面的网址看) https://blog.csdn.net/qq_4452491 ...

  7. 【机器学习】HMM

    机器学习算法-HMM 目录 机器学习算法-HMM 1. 模型定义 2. 序列生成 3. 概率计算 3.1 前向计算 3.2 后向计算 4. 学习 4.1 求解 4.2 求解 4.3 求解 5. 预测 ...

  8. golang中字符串-字节切片,字符串-字符切片的互转

    package main import ( "fmt" "reflect" ) func B2S(bs []uint8) string { // 将字节切片转换 ...

  9. linux中sort命令全面解析

    目录 一:sort命令作用 二:sort格式 1.sort参数 2.参数解析 sort命令简介 Linux sort 命令用于将文本文件内容加以排序. sort 可针对文本文件的内容,以行为单位来排序 ...

  10. python列表增加,修改,插入