bzoj#4555. [Tjoi2016&Heoi2016]求和

题目描述

Solution

有一个关于第二类斯特林数的公式:
{nm}=1m!∑i(mk)(m−k)n(−1)k\left\{ \begin{aligned} n \\ m \end{aligned} \right\}= \frac{1}{m!}\sum_i \left ( \begin{aligned} m \\ k \end{aligned} \right )(m-k)^n(-1)^k {nm​}=m!1​i∑​(mk​)(m−k)n(−1)k
因此:
Ans=∑i=0n∑j=0i∑k=0j(jk)(j−k)i(−1)k2jAns=\sum_{i=0}^n\sum_{j=0}^i\sum_{k=0}^j\tbinom{j}{k}(j-k)^i(-1)^k2^j Ans=i=0∑n​j=0∑i​k=0∑j​(kj​)(j−k)i(−1)k2j
进一步的:
Ans=∑j2jj!∑k∑i(−1)kk!(j−k)i(j−k)!Ans=\sum_{j}2^jj!\sum_{k}\sum_{i}\frac{(-1)^k}{k!}\frac{(j-k)^i}{(j-k)!} Ans=j∑​2jj!k∑​i∑​k!(−1)k​(j−k)!(j−k)i​
发现后面就是一个卷积形式。
直接NumberTheoreticTransformNumber\;\;Theoretic\;\;TransformNumberTheoreticTransform计算即可。

时间复杂度O(nlgn)O(nlgn)O(nlgn)。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int G=3;
const int Gi=(mods+1)/G;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
int f[MAXN],g[MAXN],rev[MAXN],fac[MAXN],Limit,L;
int upd(int x,int y) { return x+y>=mods?x+y-mods:x+y; }
int quick_pow(int x,int y)
{int ret=1;for (;y;y>>=1){if (y&1) ret=1ll*ret*x%mods;x=1ll*x*x%mods;}return ret;
}
void Number_Theoretic_Transform(int *A,int type)
{for (int i=0;i<Limit;i++) if (i<rev[i]) swap(A[i],A[rev[i]]);for (int mid=1;mid<Limit;mid<<=1){int Wn=quick_pow(type==1?G:Gi,(mods-1)/(mid<<1));for (int j=0;j<Limit;j+=(mid<<1))for (int k=j,w=1;k<j+mid;w=1ll*w*Wn%mods,k++){int x=A[k],y=1ll*w*A[k+mid]%mods;A[k]=upd(x,y),A[k+mid]=upd(x,mods-y);}}if (type==-1)for (int inv=quick_pow(Limit,mods-2),i=0;i<Limit;i++) A[i]=1ll*A[i]*inv%mods;
}
int main()
{int n=read();fac[0]=1;for (int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mods;f[n]=quick_pow(fac[n],mods-2);for (int i=n-1;i>=0;i--) f[i]=1ll*f[i+1]*(i+1)%mods;f[0]=g[0]=1,f[1]=n+1,g[1]=mods-1;for (int i=2;i<=n;i++) {g[i]=(i&1)?mods-f[i]:f[i]; f[i]=1ll*upd(quick_pow(i,n+1),mods-1)*quick_pow(i-1,mods-2)%mods*f[i]%mods;}Limit=1,L=0;while (Limit<=n<<1) Limit<<=1,L++;for (int i=0;i<Limit;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));Number_Theoretic_Transform(f,1);Number_Theoretic_Transform(g,1);for (int i=0;i<Limit;i++) f[i]=1ll*f[i]*g[i]%mods;Number_Theoretic_Transform(f,-1);//    for (int i=0;i<=n;i++) cout<<i<<" "<<f[i]<<endl;int ans=0;for (int i=0,t=1;i<=n;i++,t=upd(t,t)) ans=upd(ans,1ll*fac[i]*t%mods*f[i]%mods);printf("%d\n",ans);return 0;
}

bzoj#4555. [Tjoi2016Heoi2016]求和相关推荐

  1. BZOJ 4555 [Tjoi2016Heoi2016]求和

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4555 题解 f(n)=∑i=0n∑j=0iS(i,j)×2j×j!=∑i=0n∑j=0n ...

  2. 【BZOJ 4555】 4555: [Tjoi2016Heoi2016]求和 (NTT)

    4555: [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 315  Solved: 252 De ...

  3. BZOJ.4555.[HEOI2016TJOI2016]求和(NTT 斯特林数)

    题目链接 \(Description\) 求\[\sum_{i=0}^n\sum_{j=0}^iS(i,j)\times 2^j\times j!\mod 998244353\] 其中\(S(i,j) ...

  4. 【BZOJ 4555】[Tjoi2016Heoi2016]求和 多项式求逆/NTT+第二类斯特林数

    出处0.0 用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O( ...

  5. BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)

    题目链接 (lugou) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

  6. ●BZOJ 4556 [Tjoi2016Heoi2016]字符串

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4556 题解: 巨恶心...但是题很好呀,可以练习好几个比较麻烦的算法~ 1).预处理 首先用 ...

  7. 输入挂(bzoj 2901: 矩阵求和)

    很少用输入挂,以为不超时就好了,但是这题貌似不用过不去啊 只好拿出来用了,当个模板 原理是用getchar()读入会比用scanf快一些 int Read() {int x = 0, f = 1;ch ...

  8. BZOJ 2901: 矩阵求和

    2901: 矩阵求和 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 411  Solved: 216 [Submit][Status][Discus ...

  9. BZOJ P4554 [Tjoi2016Heoi2016]游戏

    BZOJ P4554 [Tjoi2016&Heoi2016]游戏 题目 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个 ...

最新文章

  1. Java RMI详解
  2. 转 一个SMD 0805的LED的电流,电压,亮度关系表
  3. 0x80004005错误代码解决方法_记一次win10更新升级失败的解决
  4. 裴蜀定理(note)
  5. python 多行字符串拼接_零基础学python的第71天
  6. 失物招领小程序_在机场丢了东西怎么办?温州机场失物招领在线办理平台暖心上线!...
  7. siri不能识别语音
  8. 内置函数(内嵌函数或内联函数)
  9. Win11字体显示不全怎么解决?
  10. mongo数据库之修改器的简单使用
  11. CRM项目半途而废 “烂摊子”该如何收拾?
  12. WPS打开文档时显示“文档被其他程序占用,是否以只读的方式”打开解决方法
  13. android手机怎么取电池,荣耀V8后盖怎么打开 华为荣耀V8手机后盖拆解与更换电池图文教程...
  14. java runtime是什么软件_Java SE Runtime Environment (JRE) 运行Java程序的必备软件
  15. 2345恶意篡改主页解决
  16. uniapp实战项目 (仿知识星球App) - - 配置开发工具和全局css样式
  17. 剑指offer刷题记录(上)
  18. Linux 下的任务切换神器 Ctrl+Z
  19. 【kimol君的无聊小发明】—用python写图片下载器
  20. [MYSQL]完犊子了,索引不生效了

热门文章

  1. 世界上最美的40个小镇,你见过多少个?
  2. 我看你还能坚持多久?!
  3. python统计出现的中文标点_Python处理中文标点符号大集合
  4. 四大金刚 数据结构_GIS技术在气象领域应用综述
  5. php3.23,MySQL 3.23.40 又发布了-PHP教程,PHP基础
  6. 鸿蒙蕴含的哲理,经典别致的人生语录,蕴含哲理,受用一生!
  7. lua虚拟机字节码修改_Java虚拟机(JVM)面试题大集合
  8. c语言 java 性能 测试_这个蓝桥杯系统的题,用c语言去评测是满分,改为Java说运行错误是0分,但是我查看输入输出,至少第...
  9. php代码里加图片,php如何添加图片
  10. php curl 使用方法,php curl使用方法与步骤