bzoj4555(数学推导+画柿子+NTT)
来源:互联网 发布:大陆如何制裁台湾 知乎 编辑:程序博客网 时间:2024/04/29 18:42
题面
今天学了多项式逆元,找到了这题。但是本蒟蒻觉得这题和逆元并没有什么关系,和逆元有关的题解也看不懂。。。
题目要你求这样一个函数,结果对一个费马素数取模。
S(i,j)为第二类斯特林数,题目还恶意地给出了递推公式。。。
经过一顿百度,知道了第二类斯特林数是这样的
含义是将n个不同的元素拆分成m个集合的方案数,显然当m>n时,S(n,m)=0。
所以原式首先可以写成
然后代第二类斯特林数的公式
接着把组合数也代进去
这个最内层的求和已经是一个卷积了,但是最外层还有个碍眼的i,难道要做n次卷积吗?
整条式子只有
这样看起来就很舒服,预处理阶乘和阶乘逆元,等比数列求和,然后上NTT就可以了。(998244353的原根是3)。
#include <iostream>#include <fstream>#include <algorithm>#include <cmath>#include <ctime>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;#define mmst(a, b) memset(a, b, sizeof(a))#define mmcp(a, b) memcpy(a, b, sizeof(b))typedef long long LL;const int N=(1<<18)+5;const LL p=998244353,g=3;LL cheng(LL a,LL b){ LL res=1ll; for(;b;b>>=1,a=a*a%p) if(b&1) res=res*a%p; return res;}int n,rev[N];void init(int lim){ int k=-1; n=1; while(n<lim) n<<=1,k++; for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1) | ((i&1)<<k);}void ntt(LL *a,int ops){ for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]); for(int l=2;l<=n;l<<=1) { int m=l>>1; LL wn; if(ops) wn=cheng(g,(p-1)/l); else wn=cheng(g,p-1-(p-1)/l); for(int i=0;i<n;i+=l) { LL w=1; for(int k=0;k<m;k++) { LL t=a[i+k+m]*w%p; a[i+k+m]=(a[i+k]-t+p)%p; a[i+k]=(a[i+k]+t)%p; w=w*wn%p; } } } if(!ops) { LL Inv=cheng(n,p-2); for(int i=0;i<n;i++) a[i]=a[i]*Inv%p; }}LL nn,ans,er[N],jc[N],a[N],b[N];int main(){ cin>>nn; jc[0]=1ll; for(LL i=1;i<=nn;i++) jc[i]=jc[i-1]*i%p; er[0]=1ll; for(int i=1;i<=nn;i++) er[i]=er[i-1]*2%p; for(LL i=0;i<=nn;i++) a[i]=cheng(jc[i],p-2); b[0]=1; b[1]=nn+1; for(LL i=2;i<=nn;i++) b[i]=(cheng(i,nn+1)-1+p)%p*cheng(i-1,p-2)%p*a[i]%p; for(int i=0;i<=nn;i++) if(i&1) a[i]=p-a[i]; init(2*nn+5); ntt(a,1); ntt(b,1); for(int i=0;i<n;i++) a[i]=a[i]*b[i]%p; ntt(a,0); for(int i=0;i<=nn;i++) ans=(ans+jc[i]*er[i]%p*a[i]%p)%p; cout<<ans<<endl; return 0;}
阅读全文
0 0
- bzoj4555(数学推导+画柿子+NTT)
- cogs2287(组合数学+画柿子+NTT)
- bzoj3456/jzoj3303:城市规划(画柿子+多项式逆元+NTT)
- [BZOJ4555][Tjoi2016&Heoi2016]求和(NTT)
- bzoj4555 [Tjoi2016&Heoi2016]求和(NTT)
- 洛谷P1445(数学+画柿子+线性筛)
- hzoi2015(ntt+组合数学)
- [BZOJ2742]-[HEOI2012]Akai的数学作业-画柿子
- 【XSY2133】【BZOJ4555】【TJOI2016】【HEOI2016】求和 第二类斯特林数 NTT
- [COGS2287][HZOI 2015]疯狂的机器人(NTT+组合数学)
- HDU 6036 Division Game(组合数学+NTT)
- HDU 6116 路径计数(组合数学+NTT)
- hdu 6036 NTT取模(板子)+组合数学
- 洛谷3678:简单的数学题(画柿子+杜教筛)
- hdoj 3980 Paint Chain(数学推导)
- hdu_4357 String change(数学推导)
- Uva - 11538 - Chess Queen(数学推导)
- Uva - 11401 - Triangle Counting(数学推导)
- 【1708.04347】用非常少的图片训练神经网络(先占个坑)
- 2018搜狐秋招 Kolakoski生成序列问题答案
- APUE第五章学习笔记
- 时间版运动框架(匀速改变样式)
- 强制类型转换
- bzoj4555(数学推导+画柿子+NTT)
- [kuangbin带你飞]专题一 简单搜索 F
- 基于gensim的Deep learning with paragraph2vec 官方models.doc2vec文档解释
- linux中软件安装
- java提高篇(七)-----关键字static
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
- LaTeX大学生数学建模模板
- js操作内容体
- 搜狐第一道