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$矩阵的第一行和第一列 ...
随机推荐
- java 基础知识学习
1: JDK VS JRE JDK: java开发工具包,提供编译和运行环境,将java编译成字节码文件,即.class文件.JDK有三个版本: j2SE, J2EE, j2me jre: 运 ...
- 2015.3.5 VS2005调用VC6 dll 时结构参数的传递
结构只能以地址方式进行传递,dll只能传递结构不能传递类 VS端: [DllImport(@"D:\程序\VC程序\MfcDllspace\Debug\space.dll")] p ...
- Win7无法访问Windows共享文件夹
解决方法如下 On the Windows 7 machine: Run secpol.msc Drill down through Local Policies | Security Options ...
- SqlServer——判断对象是否存在
对以下对象判断是否存在:database.table.proc.触发器.临时表.索引.对于这些对象的判断是通过数据表 SysObjects来获得的. 一.基础知识 1.SysObjects系统表 对于 ...
- 问题:只能在执行 Render() 的过程中调用 RegisterForEventValidation;结果:只能在执行 Render() 的过程中调用 RegisterForEventValidation
只能在执行 Render() 的过程中调用 RegisterForEventValidation 当在导出Execl或Word的时候,会发生只能在执行 Render() 的过程中调用 Register ...
- redis的特性
- opencv reshape函数说明
转自http://blog.csdn.net/yang6464158/article/details/20129991 reshape有两个参数: 其中,参数:cn为新的通道数,如果cn = 0,表示 ...
- opencv3.2 编译安装说明
Create a temporary directory, which we denote as <cmake_binary_dir>, where you want to put the ...
- Python 安装 第三方库的安装技巧
Python 安装 第三方库的安装技巧 我的电脑:Windows 10 64位. Python IDE 软件:PyCharm 2016.1.4 Python version : Python 3.5. ...
- 算法Sedgewick第四版-第1章基础-023-MultiwordSearch.java
Multi-word search. Program MultiwordSearch.java reads a sequence of query words q[1], ..., q[k] from ...