loj #6261 一个人的高三楼 FFT + 组合数递推
\(\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 + 组合数递推的更多相关文章
- LOJ #6261 一个人的高三楼
生成函数和组合数学的灵活应用 LOJ #6261 题意:求一个数列的$ k$次前缀和 $ Solution:$ 我们对原数列$ a$建生成函数$ A=\sum\limits_{i=0}^{n-1} a ...
- loj#6261. 一个人的高三楼(NTT+组合数学)
题面 传送门 题解 统计\(k\)阶前缀和,方法和这题一样 然后这里\(n\)比较大,那么把之前的柿子改写成 \[s_{j,k}=\sum_{i=1}^ja_i{j-i+k-1\choose j-i} ...
- 【NTT】loj#6261. 一个人的高三楼
去年看过t老师写这题博客:以为是道神仙题 题目大意 求一个数列的$k$次前缀和.$n\le 10^5$. 题目分析 [计数]cf223C. Partial Sums 加强版.注意到最后的式子是$f_i ...
- LOJ#3092. 「BJOI2019」排兵布阵(递推)
题面 传送门 题解 设\(dp_{i,j}\)表示前\(i\)座塔派了总共\(j\)个人的最大收益,转移显然 //minamoto #include<bits/stdc++.h> #def ...
- BZOJ3028 食物 和 LOJ6261 一个人的高三楼
总结一下广义二项式定理. 食物 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数 ...
- XJOI 夏令营501-511NOIP训练18 高三楼
参观完各种饭堂,学校还有什么著名的景点呢?当然是教室了,此时此刻我 们来到了高三楼.你会发现高三楼门口会有以身份认证系统,这东西还有着一段疼人的历史.每年的九月到来,高三的童鞋大多不习惯学校的作息时间 ...
- [LOJ6261]一个人的高三楼
loj description 给你一个长度为\(n\)的数列\(a_i\),求它的\(k\)次前缀和模\(998244353\).(就是做\(k\)次前缀和后的数列) \(n\le10^5,k\le ...
- 【BZOJ】1089: [SCOI2003]严格n元树(递推+高精度/fft)
http://www.lydsy.com/JudgeOnline/problem.php?id=1089 题意:求深度为d的n元树数目.(0<n<=32, 0<=d<=16) ...
- BZOJ4451 [Cerc2015]Frightful Formula 多项式 FFT 递推 组合数学
原文链接http://www.cnblogs.com/zhouzhendong/p/8820963.html 题目传送门 - BZOJ4451 题意 给你一个$n\times n$矩阵的第一行和第一列 ...
随机推荐
- WebApi学习系列
最近有一些时间,打算学习和整理一下Web API的一些学习资料的翻译工作.以下是对Web API 的大概目录的整理.欢迎更多的朋友一起加入到学习Web API 的队伍中来,如果你想贡献自己的,请联 ...
- .Net 之Tuple 类
Tuple是什么 按照Msdn 上说:提供用于创造元组对象的静态方法.从字面意思并不能理解他的作用: Tuple 是个静态类,提供8个静态泛型方法:T 可以是值类型,也可是引用类型: 使用场景 ...
- ruby on rails 中render的
Ruby rails页面跳转代码如下: 1.render(:text => string) 2.render(:inline => string, [:type => "r ...
- web 应用 及 补充
Highcharts 绘图配置 的函数及参数 web页面文本框修饰器 --- KindEditor web页面 之 超人性的点赞与狂踩 web页面 之 图片上传 web页面 之 评论盖楼 jQuery ...
- CSS3新特性详解
本文讲解CSS3相关实用知识点 CSS3相关实用知识点目录 边框设置 颜色设置 背景设置 渐变使用 超出文本设置 阴影设置 CSS3变换设置 过渡设置 动画设置 多列布局 BoxSizing设置 弹性 ...
- 基于windows平台的命令行软件安装工具Chocolatey的安装
本文介绍Chocolatey的安装和使用 Chocolatey 这是基于.NET Framework 4以上的windows安装软件的命令行工具 安装 第一步,打开你的powershell.exe,使 ...
- _tprintf(), printf(),wprintf() 与控制字符 %s 和 %S(Unicoe与GB2312))
_tprintf() 是 printf() 和 wprintf() 的通用类型:如果定义了 _unicode,那么 _tprintf() 就会转换为 wprintf(),否则为 printf() . ...
- C#调用带返回值的存储过程
()在SQL Server中建立如下的存储过程: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[GetNa ...
- Tiny4412 Linux 内核启动流程
Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...
- does not contain bitcode. You must rebuild it with
*** does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE ...