\(\color{#0066ff}{ 题目描述 }\)

一天的学习快要结束了,高三楼在晚自习的时候恢复了宁静。

不过,\(HSD\) 桑还有一些作业没有完成,他需要在这个晚自习写完。比如这道数学题:

1、给出一个数列,求它的前 \(i\) 项和 \(S_i\),\(i\in \{x|1\le x\le n,x\in \mathbb{N}\}\)

HSD 桑擅长数学,很快就把这题秒了……

然而还有第二题:

2、如果把上一问的前 \(i\) 项和看成一个新数列,请求出它的前 \(i\) 项和

看完第二题,还有第三题……HSD 桑已经预感到情况不妙了。

HSD 桑大致看了看题,发现有些规律。其实就是在求 \(k\) 次前缀和。如果我们借用函数迭代的标记,就是在求 \(S_n^{(k)}\)……

HSD 桑还有很多作业要写,请你帮助他完成这项作业。

\(\color{#0066ff}{输入格式}\)

第一行,两个正整数 \(n,k\),\(n\) 表示数列的长度,\(k\) 的意义如题目描述; 第二行,\(n\) 个正整数,表示这个数列,两个数之间用一个空格隔开。

\(\color{#0066ff}{输出格式}\)

共 \(n\) 行,每行一个数,第 \(i\) 行表示 \(S_i^{(k)}\),结果可能会非常大,请对 \(998244353\) 取模后输出。

\(\color{#0066ff}{输入样例}\)

4 1
1 2 3 4 4 3
1 2 3 4

\(\color{#0066ff}{输出样例}\)

1
3
6
10 1
5
15
35

\(\color{#0066ff}{数据范围与提示}\)

样例解释 1

对于这个序列,求它的 11 次前缀和,就是输出这个数列的前缀和咯……

样例解释 2

要求这个数列的 33 次前缀和,这个数列的 11 次前缀和为 {1,3,6,10}{1,3,6,10},22 次前缀和为 {1,4,10,20}{1,4,10,20},33 次前缀和即为 {1,5,15,35}{1,5,15,35}。

\(\color{#0066ff}{ 题解 }\)

天真的我一看,快速幂套FFT,傻逼题啊,于是开始切

然后。。。。各种TLE

然后发现,根组合数有关

比如

a b c d

a a+b a+b+c a+b+c+d

a 2a+b 3a+2b+c 4a+3b+2c+d

a 3a+b 6a+3b+c 10a+6b+3c+d

这。。。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

这TM前面的系数居然TM是组合数的一列

但是尼玛k是\(2^{60}\)啊,怎么求组合数???

这时gw提醒了我,第一项就是1啊,然后后面随便成一下\(O(n)\)递推就行了啊

恍然大悟自己多么愚蠢qwq

刚好是倒过来的,所以不用翻转,直接FFT出ans

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
using std::vector;
const int mod = 998244353;
const int maxn = 4e6 + 100;
int len, r[maxn];
LL c;
LL ksm(LL x, LL y) {
LL re = 1LL;
while(y) {
if(y & 1) re = re * x % mod;
x = x * x % mod;
y >>= 1;
}
return re;
}
void FNTT(vector<int> &A, int flag) {
A.resize(len);
for(int i = 0; i < len; i++) if(i < r[i]) std::swap(A[i], A[r[i]]);
for(int l = 1; l < len; l <<= 1) {
int w0 = ksm(3, (mod - 1) / (l << 1));
for(int i = 0; i < len; i += (l << 1)) {
int w = 1, a0 = i, a1 = i + l;
for(int k = 0; k < l; k++, a0++, a1++, w = 1LL * w * w0 % mod) {
int tmp = 1LL * A[a1] * w % mod;
A[a1] = ((A[a0] - tmp) % mod + mod) % mod;
A[a0] = (A[a0] + tmp) % mod;
}
}
}
if(!(~flag)) {
std::reverse(A.begin() + 1, A.end());
int inv = ksm(len, mod - 2);
for(int i = 0; i < len; i++) A[i] = 1LL * A[i] * inv % mod;
}
}
vector<int> operator * (vector<int> A, vector<int> B) {
int tot = A.size() + B.size() - 1;
for(len = 1; len <= tot; len <<= 1);
for(int i = 0; i < len; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) * (len >> 1));
FNTT(A, 1), FNTT(B, 1);
vector<int> ans;
ans.resize(len);
for(int i = 0; i < len; i++) ans[i] = 1LL * A[i] * B[i] % mod;
FNTT(ans, -1);
ans.resize(tot);
return ans;
}
int main() {
int n = in();
c = in() % mod;
vector<int> a, b;
for(int i = 1; i <= n; i++) a.push_back(in());
LL now = 1;
for(int i = 1; i <= n; i++) {
b.push_back((int)(now % mod));
now = (1LL * now * (c + i - 1) % mod) * ksm(i, mod - 2) % mod;
}
a = a * b;
for(int i = 0; i < n; i++) printf("%d\n", a[i]);
return 0;
}

loj #6261 一个人的高三楼 FFT + 组合数递推的更多相关文章

  1. LOJ #6261 一个人的高三楼

    生成函数和组合数学的灵活应用 LOJ #6261 题意:求一个数列的$ k$次前缀和 $ Solution:$ 我们对原数列$ a$建生成函数$ A=\sum\limits_{i=0}^{n-1} a ...

  2. loj#6261. 一个人的高三楼(NTT+组合数学)

    题面 传送门 题解 统计\(k\)阶前缀和,方法和这题一样 然后这里\(n\)比较大,那么把之前的柿子改写成 \[s_{j,k}=\sum_{i=1}^ja_i{j-i+k-1\choose j-i} ...

  3. 【NTT】loj#6261. 一个人的高三楼

    去年看过t老师写这题博客:以为是道神仙题 题目大意 求一个数列的$k$次前缀和.$n\le 10^5$. 题目分析 [计数]cf223C. Partial Sums 加强版.注意到最后的式子是$f_i ...

  4. LOJ#3092. 「BJOI2019」排兵布阵(递推)

    题面 传送门 题解 设\(dp_{i,j}\)表示前\(i\)座塔派了总共\(j\)个人的最大收益,转移显然 //minamoto #include<bits/stdc++.h> #def ...

  5. BZOJ3028 食物 和 LOJ6261 一个人的高三楼

    总结一下广义二项式定理. 食物 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数 ...

  6. XJOI 夏令营501-511NOIP训练18 高三楼

    参观完各种饭堂,学校还有什么著名的景点呢?当然是教室了,此时此刻我 们来到了高三楼.你会发现高三楼门口会有以身份认证系统,这东西还有着一段疼人的历史.每年的九月到来,高三的童鞋大多不习惯学校的作息时间 ...

  7. [LOJ6261]一个人的高三楼

    loj description 给你一个长度为\(n\)的数列\(a_i\),求它的\(k\)次前缀和模\(998244353\).(就是做\(k\)次前缀和后的数列) \(n\le10^5,k\le ...

  8. 【BZOJ】1089: [SCOI2003]严格n元树(递推+高精度/fft)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1089 题意:求深度为d的n元树数目.(0<n<=32, 0<=d<=16) ...

  9. BZOJ4451 [Cerc2015]Frightful Formula 多项式 FFT 递推 组合数学

    原文链接http://www.cnblogs.com/zhouzhendong/p/8820963.html 题目传送门 - BZOJ4451 题意 给你一个$n\times n$矩阵的第一行和第一列 ...

随机推荐

  1. WebApi学习系列

      最近有一些时间,打算学习和整理一下Web API的一些学习资料的翻译工作.以下是对Web API 的大概目录的整理.欢迎更多的朋友一起加入到学习Web API 的队伍中来,如果你想贡献自己的,请联 ...

  2. .Net 之Tuple 类

    Tuple是什么 按照Msdn 上说:提供用于创造元组对象的静态方法.从字面意思并不能理解他的作用:   Tuple 是个静态类,提供8个静态泛型方法:T 可以是值类型,也可是引用类型:   使用场景 ...

  3. ruby on rails 中render的

    Ruby rails页面跳转代码如下: 1.render(:text => string) 2.render(:inline => string, [:type => "r ...

  4. web 应用 及 补充

    Highcharts 绘图配置 的函数及参数 web页面文本框修饰器 --- KindEditor web页面 之 超人性的点赞与狂踩 web页面 之 图片上传 web页面 之 评论盖楼 jQuery ...

  5. CSS3新特性详解

    本文讲解CSS3相关实用知识点 CSS3相关实用知识点目录 边框设置 颜色设置 背景设置 渐变使用 超出文本设置 阴影设置 CSS3变换设置 过渡设置 动画设置 多列布局 BoxSizing设置 弹性 ...

  6. 基于windows平台的命令行软件安装工具Chocolatey的安装

    本文介绍Chocolatey的安装和使用 Chocolatey 这是基于.NET Framework 4以上的windows安装软件的命令行工具 安装 第一步,打开你的powershell.exe,使 ...

  7. _tprintf(), printf(),wprintf() 与控制字符 %s 和 %S(Unicoe与GB2312))

    _tprintf() 是 printf() 和 wprintf() 的通用类型:如果定义了 _unicode,那么 _tprintf() 就会转换为 wprintf(),否则为 printf() . ...

  8. C#调用带返回值的存储过程

    ()在SQL Server中建立如下的存储过程: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[GetNa ...

  9. Tiny4412 Linux 内核启动流程

    Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...

  10. does not contain bitcode. You must rebuild it with

    *** does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE ...