UOJ269【清华集训2016】如何优雅地求和【数论,多项式】
题目描述:求
$$\sum_{k=0}^nf(k)\binom{n}{k}x^k(1-x)^{n-k}$$
输入$n$,$f(x)$的次数上界$m$,$x$,$f(0,1,\ldots,m)$,对$998244353$取模。
数据范围:$1\leq n\leq 10^9,1\leq m\leq 2*10^4,0\leq a_i,x<998244353$
现在来讲正解:首先我们把$f(x)$用下降幂来表示,(看到这里的快点关掉,然后自己推一推)
$$\begin{align*}Ans&=\sum_{k=0}^n\sum_{i=0}^ma_i*\frac{k!}{(k-i)!}\frac{n!}{k!(n-k)!}x^k(1-x)^{n-k} \\&=\sum_{k=0}^n\sum_{i=0}^ma_i*\frac{n!}{(k-i)!(n-k)!}x^k(1-x)^{n-k} \\&=\sum_{i=0}^ma_in!\sum_{k=i}^n\frac{x^k}{(k-i)!}*\frac{(1-x)^{n-k}}{(n-k)!} \\&=\sum_{i=0}^ma_ix^in!(e^x*e^{1-x}[x^{n-i}]) \\&=\sum_{i=0}^ma_ix^i\frac{n!}{(n-i)!}\end{align*}$$
然后就是考虑如何点值转下降幂了
$$\begin{align*}f(i)&=\sum_{j=0}^ma_j\frac{i!}{(i-j)!} \\\frac{f(i)}{i!}&=\sum_{j=0}^ma_j*\frac{1}{(i-j)!}\end{align*}$$
所以$f(i)$的EGF等于$a$的OGF乘上$e^x$,所以$a$的OGF等于$f(i)$的EGF乘上$e^{-x}$,使用NTT优化计算,时间复杂度$O(m\log m)$
#include<bits/stdc++.h>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = << , mod = , G = , Gi = ;
int n, m, x, A[N], B[N], fac[N], invfac[N], ans;
inline int kasumi(int a, int b){
int res = ;
while(b){
if(b & ) res = (LL) res * a % mod;
a = (LL) a * a % mod;
b >>= ;
}
return res;
}
inline void init(){
fac[] = ;
for(Rint i = ;i <= m;i ++) fac[i] = (LL) i * fac[i - ] % mod;
invfac[m] = kasumi(fac[m], mod - );
for(Rint i = m;i;i --) invfac[i - ] = (LL) i * invfac[i] % mod;
}
int rev[N];
inline int calrev(int len){
int limit = , L = -;
while(limit <= len){limit <<= ; L ++;}
for(Rint i = ;i < limit;i ++)
rev[i] = (rev[i >> ] >> ) | ((i & ) << L);
return limit;
}
inline void NTT(int *A, int limit, int type){
for(Rint i = ;i < limit;i ++)
if(i < rev[i]) swap(A[i], A[rev[i]]);
for(Rint mid = ;mid < limit;mid <<= ){
int Wn = kasumi(type == ? G : Gi, (mod - ) / (mid << ));
for(Rint j = ;j < limit;j += (mid << )){
int w = ;
for(Rint k = ;k < mid;k ++, w = (LL) w * Wn % mod){
int x = A[j + k], y = (LL) w * A[j + k + mid] % mod;
A[j + k] = (x + y) % mod;
A[j + k + mid] = (x - y + mod) % mod;
}
}
}
if(type == -){
int inv = kasumi(limit, mod - );
for(Rint i = ;i < limit;i ++)
A[i] = (LL) A[i] * inv % mod;
}
}
int main(){
scanf("%d%d%d", &n, &m, &x);
init();
for(Rint i = ;i <= m;i ++){
scanf("%d", A + i);
A[i] = (LL) A[i] * invfac[i] % mod;
B[i] = invfac[i];
if(i & ) B[i] = mod - B[i];
}
int limit = calrev(m << );
NTT(A, limit, ); NTT(B, limit, );
for(Rint i = ;i < limit;i ++) A[i] = (LL) A[i] * B[i] % mod;
NTT(A, limit, -);
int w = ;
for(Rint i = ;i <= m;i ++){
ans = (ans + (LL) w * A[i] % mod) % mod;
w = (LL) w * (mod + n - i) % mod * x % mod;
}
printf("%d", ans);
}
UOJ269
启发:推柿子遇到多项式时应考虑多项式的各种形式,如点值,普通/上升/下降幂等。
UOJ269【清华集训2016】如何优雅地求和【数论,多项式】的更多相关文章
- UOJ269 清华集训2016 如何优雅地求和 下降幂多项式、NTT
代码 神仙题? 看到连续的点值,那么一定是要利用到连续点值的性质,可以考虑下降幂多项式,即考虑多项式\(F(x) = \sum\limits_{i=0}^m a_ix^{\underline i}\) ...
- [清华集训2016]如何优雅地求和——NTT
题目链接: [清华集训2016]如何优雅地求和 题目大意:给出一个多项式$m+1$个点值$a_{0},a_{1}...a_{m}$(其中$f(i)=a_{i}$),并给出两个数$n,x$,求$Q(f, ...
- 洛谷 P6667 - [清华集训2016] 如何优雅地求和(下降幂多项式,多项式)
题面传送门 wjz:<如何优雅地 AK NOI> 我:如何优雅地爆零 首先,按照这题总结出来的一个小套路,看到多项式与组合数结合的题,可以考虑将普通多项式转为下降幂多项式,因为下降幂和组合 ...
- UOJ #269. 【清华集训2016】如何优雅地求和
UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- UOJ 275. 【清华集训2016】组合数问题
UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...
- 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT
[UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很 ...
- [UOJ#276]【清华集训2016】汽水
[UOJ#276][清华集训2016]汽水 试题描述 牛牛来到了一个盛产汽水的国度旅行. 这个国度的地图上有 \(n\) 个城市,这些城市之间用 \(n−1\) 条道路连接,任意两个城市之间,都存在一 ...
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
随机推荐
- php中的htmlspecialchars_decode()函数
htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符. <?php $str = "This is some <b>bold&l ...
- 十二.作业难点(有IT大牛路过的可以帮我解答我的疑问?万分感谢)--转行的苦逼人
今天开始改变写博客风格,其他不多说. 今天题目如下: # 7.写函数,完成以下功能: (8分) # 例如有: # user_list=[ # {"name": "alex ...
- command injection命令注入
命令注入 是指程序中有调用系统命令的部分,例如输入ip,程序调用系统命令ping这个ip.如果在ip后面加一个&&.&.|.||命令拼接符号再跟上自己需要执行的系统命令 在pi ...
- 浅谈JS中 var let const 变量声明
浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...
- js数组【续】(相关方法)
一.数组的栈,队列方法[调用这些方法原数组会发生改变]var arr = [2,3,4,5,6];1.栈 LIFO (Last-In-First-Out)a.push() 可接受任意类型的参数,将它们 ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约
本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6. ...
- CSS 之 圣杯布局&双飞翼布局
圣杯布局 和 双飞翼布局 是重要布局方式.两者的功能相同,都是为了实现一个两侧宽度固定,中间宽度自适应的三栏布局. 遵循了以下要点: 两侧宽度固定,中间宽度自适应 中间部分在DOM结构上优先,以便先行 ...
- slf4j的正确使用
头两天领导分配个任务是要把项目中所有try catch里的异常处理收集到elk中,由于之前的处理方式五花八门,就集中处理了下, 事后还被批评了. 不是所有的异常信息都需要被记录到log中 使用SLF4 ...
- window.requestAnimationFrame()的使用,处理更流畅的动画效果
https://blog.csdn.net/w2765006513/article/details/53843169 window.requestAnimationFrame()的使用 2016年12 ...
- 图说jdk1.8新特性(4)--- stream
总述 jdk1.8引入了Stream相关的API,通过该API.可以实现流式编程,使你写代码的时候行云流水 Stream使得集合的转换变得更加简单,原来可能需要写多个for循环或者多个if判断的,直接 ...