UOJ#269. 【清华集训2016】如何优雅地求和
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ269.html
题目传送门 - UOJ269
题意
有一个多项式函数 $f(x)$,最高次幂为 $x^m$,定义变换 $Q$:
$$Q(f,n,x)=\sum_{k=0}^n f(k)\binom nk x^k(1−x)^{n−k}$$
现在给定函数 $f$ 和 $n,x$,求 $Q(f,n,x)\mod {\rm 998244353}$。
$f(x)$ 由 $0$~$m$ 的点值给出。
$1\leq n\leq 10^9,1\leq m \leq 2\times 10^4, 0\leq a_i,x <998244353$
题解
cly_none 太强了。
考虑一个 $m$ 次多项式 $f(x)$ ,必然可以拆成一堆下降幂的和。(忽略系数)其中,最高次项是 $m$ 次项,所以转成下降幂之后,最高次项就是一个 $m$ 阶下降幂。
对于 $f(x)$ 的某一个下降幂表示,设为 $x^\underline{k}$ ,那么,可以得到:
$$\begin{aligned} & \sum_{i=0}^n i^{\underline k} {n\choose i} x^i (1-x)^{n-i} \\ = & \sum_{i=k}^n i^{\underline k} \frac {n^{\underline k}}{i ^ {\underline k}} {n - k\choose i - k } x^i (1-x)^{n-i} \\ = & n^{\underline k} \sum_{i=k}^n {n - k\choose i - k } x^i (1-x)^{n-i} \\ = & n^{\underline k} x^k \sum_{i=0}^{n-k} {n - k\choose i} x^i (1-x)^{n-k-i} \\ = & n^{\underline k} x^k \end{aligned}$$
于是这样就证明了题目要求的式子是一个关于 $n$ 的 $m$ 次多项式。
于是只需要 FFT 一下,求出 $[0,m]$ 之间的整点的点值,然后插值来求答案。由于这些点值十分特殊,所以可以预处理阶乘来 $O(m)$ 求解。
总的时间复杂度为 $O(m\log m)$ 。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1<<16,mod=998244353;
int read(){int x=0;char ch=getchar();while (!isdigit(ch))ch=getchar();while (isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x;
}
int Pow(int x,int y){int ans=1;for (;y;y>>=1,x=1LL*x*x%mod)if (y&1)ans=1LL*ans*x%mod;return ans;
}
int n,m,x,a[N],A[N],B[N];
int Fac[N],Inv[N];
int w[N],R[N];
int C(int n,int m){if (m>n||m<0)return 0;return 1LL*Fac[n]*Inv[m]%mod*Inv[n-m]%mod;
}
void FFT(int a[],int n){for (int i=0;i<n;i++)if (R[i]<i)swap(a[R[i]],a[i]);for (int t=n>>1,d=1;d<n;d<<=1,t>>=1)for (int i=0;i<n;i+=(d<<1))for (int j=0;j<d;j++){int tmp=1LL*w[t*j]*a[i+j+d]%mod;a[i+j+d]=(a[i+j]+mod-tmp)%mod;a[i+j]=(a[i+j]+tmp)%mod;}
}
void Mul(int a[],int b[],int m){int n,d;for (n=1,d=0;n<=m*2+2;n<<=1,d++);for (int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(d-1));w[0]=1,w[1]=Pow(3,(mod-1)/n);for (int i=2;i<n;i++)w[i]=1LL*w[i-1]*w[1]%mod;FFT(a,n);FFT(b,n);for (int i=0;i<n;i++)a[i]=1LL*a[i]*b[i]%mod;w[0]=1,w[1]=Pow(w[1],mod-2);for (int i=2;i<n;i++)w[i]=1LL*w[i-1]*w[1]%mod;FFT(a,n);int inv=Pow(n,mod-2);for (int i=0;i<n;i++)a[i]=1LL*a[i]*inv%mod;
}
int calc(int n){int ans=0;for (int k=0;k<=n;k++)ans=(1LL*a[k]*C(n,k)%mod*Pow(x,k)%mod*Pow(mod+1-x,n-k)%mod+ans)%mod;return ans;
}
int main(){n=read(),m=read(),x=read();for (int i=0;i<=m;i++)a[i]=read();for (int i=Fac[0]=Inv[0]=1;i<=m;i++){Fac[i]=1LL*Fac[i-1]*i%mod;Inv[i]=1LL*Inv[i-1]*Pow(i,mod-2)%mod;}if (n<=m)return printf("%d\n",calc(n)),0;for (int i=0;i<=m;i++){A[i]=1LL*a[i]*Inv[i]%mod*Pow(x,i)%mod;B[i]=1LL*Inv[i]*Pow(mod+1-x,i)%mod;}Mul(A,B,m);for (int i=0;i<=m;i++)A[i]=1LL*A[i]*Fac[i]%mod;int ans=0;for (int i=0;i<=m;i++){int t=1LL*A[i]*Inv[i]%mod*Inv[m-i]%mod;t=1LL*t*Pow(n+mod-i,mod-2)%mod;if ((m-i)&1)t=(mod-t)%mod;ans=(ans+t)%mod;}for (int i=n;i>=n-m;i--)ans=1LL*ans*i%mod;printf("%d",ans);return 0;
}
转载于:https://www.cnblogs.com/zhouzhendong/p/UOJ269.html
UOJ#269. 【清华集训2016】如何优雅地求和相关推荐
- BZOJ 4734 UOJ #269 [清华集训2016]如何优雅地求和 (多项式)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734 (UOJ) http://uoj.ac/problem/269 题解 ...
- BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...
- UOJ 267 [清华集训2016]魔法小程序
前缀和 非常认真地观察代码之后我们会发现实际上这是一个多维前缀和问题,c就记录前缀和.考虑前缀和的逆操作,即可复原出原数组. 提示:k维前缀和可以看作k-1维前缀和的前缀和,从而递归下去 #inclu ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- [清华集训2016]石家庄的工人阶级队伍比较坚强——三进制FWT
题目链接: [清华集训2016]石家庄的工人阶级队伍比较坚强 题目大意:有$n=3^m$个人玩石头剪刀布,共$t$轮游戏,每轮每个人要和包括自己的所有人各进行$m$次石头剪刀布.每个人在$m$轮中的决 ...
- 【清华集训2016】数据交互
[清华集训2016]数据交互 比较神的\(DDP\). 首先对于给出的一条链我们分两部分统计:\(lca\)以及其他部分. 我们设两个变量\(w_i,g_i\).一条路径的权值就是路径上所有点的\(w ...
- P6669 [清华集训2016] 组合数问题
P6669 [清华集训2016] 组合数问题 题意: 给你n,m,k,问有多少对(i,j)满足K∣CijK|C_{i}^{j}K∣Cij (Cij是k的倍数C_{i}^{j}是k的倍数Cij是k的 ...
- [清华集训2016]你的生命已如风中残烛——组合数学
题目链接: [清华集训2016]你的生命已如风中残烛 题目大意:共有$m+1$张牌,其中有$n$张特殊牌,每张特殊牌有一个权值$w_{i}$表示取到这张牌能获得$w_{i}$次再抽牌的机会,保证$\s ...
- UOJ #268 BZOJ 4732 [清华集训2016]数据交互 (树链剖分、线段树)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...
- UOJ #277 BZOJ 4739 [清华集训2016]定向越野 (计算几何、最短路)
手动博客搬家: 本文发表于20181208 14:39:01, 原地址https://blog.csdn.net/suncongbo/article/details/84891710 哇它居然显示出图 ...
最新文章
- python3 多进程 multiprocessing 报错 AttributeError: ‘ForkAwareLocal‘ object has no attribute ‘connection‘
- PyCharm与git/GitHub取消关联
- 互联网经济与实体经济
- ArrayList各方法的时间复杂度
- preloadlazy load
- 凑个热闹-LayoutInflater相关分析
- jQuery 方法 属性
- Java 并发编程之自定义线程池 ThreadPoolExecutor
- 深度学习快速参考 | iBooker·ApacheCN
- 全国计算机一级考试网络知识,全国计算机等级考试一级网络基础知识复习题及答案.doc...
- linux下重命名文件
- bootbox 使用方式
- 当你在追梦的路上抱怨生活太累快要放弃的时候,不妨看看我的这篇文章
- pdf转换成word后有文字叠加_pdf转成word后格式快速调整
- esxi 虚拟机的控制台上键盘无法输入
- ubuntu安装nividia驱动
- 雨中走路淋雨多还是跑步淋雨多?
- Linux 打印机移植说明
- TCP 的三次握手+两次交换+四次挥手
- Python实现86五笔反查代码
热门文章
- Windows Azure 安全最佳实践 - 第 7 部分:提示、工具和编码最佳实践
- IPhone IPad 利用cocos2d开发游戏问题
- 软件工程 - 设计模式学习之策略模式Strategy
- .net网页的生命周期列表
- 在vs编辑器里走来走去的快捷键
- Nginx作为WebSocket代理(Handshake failed due to invalid Upgrade header: null)
- 28. (附加)字符串的组合(C++版本)
- Maven中DependencyManagement和Dependencies区别
- python代码段_python代码段有哪些
- python爬虫如何连接数据库_Python爬虫框架和数据库连接