P5488 差分与前缀和 解题报告

link

题目大意

给定一个长度为 n n n 的序列 a i a_i ai​ ,求其 k k k 阶差分或前缀和。对 1004535809 取模。

1 ≤ n ≤ 1 0 5 1\le n \le 10^5 1≤n≤105, 0 ≤ a i ≤ 1 0 9 0\le a_i\le 10^9 0≤ai​≤109, 1 ≤ k ≤ 1 0 2333 , k ≢ 0 ( m o d 1004545809 ) 1\le k\le 10^{2333},k\not\equiv 0\pmod {1004545809} 1≤k≤102333,k​≡0(mod1004545809)

解题思路

一道生成函数裸题。

设序列的OGF为 A ( x ) = ∑ n ≥ 0 a n x n A(x)=\sum\limits_{n\ge 0}a_nx^n A(x)=n≥0∑​an​xn。

则求差分为 A − ( x ) = ( 1 − x ) A ( x ) A^{-}(x)=(1-x)A(x) A−(x)=(1−x)A(x), k k k 阶差分是 A k − = ( 1 − x ) k A ( x ) A^{k-}=(1-x)^kA(x) Ak−=(1−x)kA(x)。

这是因为
A − ( x ) = [ x 0 ] A ( x ) + ∑ n ≥ 1 ( a n − a n − 1 ) x n = [ x 0 ] A ( x ) + ∑ n ≥ 1 a n x n − ∑ n ≥ 1 a n − 1 x n = A ( x ) − x ∑ n ≥ 1 a n − 1 x n − 1 = A ( x ) − x A ( x ) = ( 1 − x ) A ( x ) A^-(x)=[x^0]A(x)+\sum_{n\ge 1}(a_n-a_{n-1})x^n\\ =[x^0]A(x)+\sum_{n\ge 1}a_nx^n-\sum_{n\ge 1}a_{n-1}x^n\\ =A(x)-x\sum_{n\ge 1}a_{n-1}x^{n-1}\\ =A(x)-xA(x)=(1-x)A(x) A−(x)=[x0]A(x)+n≥1∑​(an​−an−1​)xn=[x0]A(x)+n≥1∑​an​xn−n≥1∑​an−1​xn=A(x)−xn≥1∑​an−1​xn−1=A(x)−xA(x)=(1−x)A(x)
而求前缀和为 A + ( x ) = 1 1 − x A ( x ) A^+(x)=\dfrac1{1-x}A(x) A+(x)=1−x1​A(x), k k k 阶前缀和为 A k + = 1 ( 1 − x ) k A ( x ) A^{k+}=\dfrac 1 {(1-x)^k}A(x) Ak+=(1−x)k1​A(x)。

这是因为
A + ( x ) = ∑ n ≥ 0 ∑ i = 0 n a i ⋅ x n = ∑ i ≥ 0 a i ∑ n ≥ i x n = ∑ i ≥ 0 a i x i 1 − x = 1 1 − x ∑ i ≥ 0 a i x i = 1 1 − x A ( x ) A^+(x)=\sum_{n\ge 0}\sum_{i=0}^na_i\cdot x^n\\ =\sum_{i\ge 0}a_i\sum_{n\ge i}x^n\\ =\sum_{i\ge 0}a_i\dfrac{x^i}{1-x}\\ =\dfrac 1 {1-x}\sum_{i\ge 0}a_ix^i=\dfrac 1 {1-x}A(x) A+(x)=n≥0∑​i=0∑n​ai​⋅xn=i≥0∑​ai​n≥i∑​xn=i≥0∑​ai​1−xxi​=1−x1​i≥0∑​ai​xi=1−x1​A(x)
所以只要求 ( 1 − x ) α (1-x)^{\alpha} (1−x)α ,再乘起来即可。那么直接用个 Ln 和 Exp 即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
char In[1 << 20], *ss = In, *tt = In;
#define getchar() (ss == tt && (tt = (ss = In) + fread(In, 1, 1 << 20, stdin), ss == tt) ? EOF : *ss++)
ll read() {ll x = 0, f = 1; char ch = getchar();for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + int(ch - '0');return x * f;
}
#define clr(f, s, e) memset(f + (s), 0x00, sizeof(ll) * ((e) - (s)))
#define cpy(f, g, len) memcpy(g, f, sizeof(ll) * (len))
const int MAXN = 1 << 18, P = 1004535809, G = 3, invG = 334845270;
ll pls(ll a, ll b) {return a + b < P ? a + b : a + b - P;}
ll mns(ll a, ll b) {return a < b ? a + P - b : a - b;}
ll mul(ll a, ll b) {return a * b % P;}
ll qpow(ll a, int n) {ll ret = 1; for(; n; n >>= 1, a = mul(a, a)) if(n & 1) ret = mul(ret, a);  return ret;}
int tr[MAXN], tf;
int getlim(int n) {int lim = 1; for(; lim < n + n; lim <<= 1);return lim;
}
void tpre(int lim) {if(lim == tf) return ;tf = lim; for(int i = 0; i < lim; i++) tr[i] = (tr[i >> 1] >> 1) | ((i & 1) ? (lim >> 1) : 0);
}
void NTT(ll* f, int lim, int fl) {tpre(lim); for(int i = 0; i < lim; i++) if(i < tr[i]) swap(f[i], f[tr[i]]);for(int l = 2, k = 1; l <= lim; l <<= 1, k <<= 1) {ll g0 = qpow(fl ? G : invG, (P-1) / l);for(int i = 0; i < lim; i += l) {ll gn = 1;for(int j = i; j < i+k; j++, gn = mul(gn, g0)) {ll tt = mul(gn, f[j+k]);f[j+k] = mns(f[j], tt);f[j] = pls(f[j], tt);}}}if(!fl) {ll in = qpow(lim, P-2);for(int i = 0; i < lim; i++) f[i] = mul(f[i], in);}
}
void Mul(ll* f, ll* g, ll* h, int n) {static ll a[MAXN], b[MAXN];int lim = getlim(n);cpy(f, a, n); clr(a, n, lim);cpy(g, b, n); clr(b, n, lim);NTT(a, lim, 1); NTT(b, lim, 1);for(int i = 0; i < lim; i++) h[i] = mul(a[i], b[i]);NTT(h, lim, 0); clr(h, n, lim);
}
void Inv(ll* f, ll* g, int n) {static ll a[MAXN];if(n == 1) {g[0] = qpow(f[0], P-2); return ;}Inv(f, g, (n + 1) >> 1);int lim = getlim(n);clr(g, (n + 1) >> 1, lim);cpy(f, a, n); clr(a, n, lim);NTT(a, lim, 1); NTT(g, lim, 1);for(int i = 0; i < lim; i++) g[i] = (2 - a[i] * g[i] % P + P) * g[i] % P;NTT(g, lim, 0); clr(g, n, lim);
}
void Deriv(ll* f, ll* g, int n) {for(int i = 1; i < n; i++) g[i-1] = mul(f[i], i);g[n-1] = 0;
}
void Integ(ll* f, ll* g, int n) {for(int i = 1; i < n; i++) g[i] = mul(f[i-1], qpow(i, P-2));g[0] = 0;
}
void Ln(ll* f, ll* g, int n) {static ll a[MAXN], b[MAXN];Deriv(f, a, n); Inv(f, b, n);Mul(a, b, a, n); Integ(a, g, n);
}
void Exp(ll* f, ll* g, int n) {static ll a[MAXN], b[MAXN];if(n == 1) {g[0] = 1; return;}Exp(f, g, (n + 1) >> 1);int lim = getlim(n);clr(g, (n + 1) >> 1, lim);cpy(f, a, n); clr(a, n, lim);Ln(g, b, n); clr(b, n, lim);NTT(a, lim, 1); NTT(b, lim, 1); NTT(g, lim, 1);for(int i = 0; i < lim; i++) g[i] = (1 - b[i] + a[i] + P) * g[i] % P;NTT(g, lim, 0); clr(g, n, lim);
}
ll readk() {ll x = 0; char ch = getchar();for(; ch < '0' || ch > '9'; ch = getchar());for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x * 10 + ch - '0') % P;return x;
}
int n;
ll k, t, a[MAXN], b[MAXN], c[MAXN];
int main() {n = read(); k = readk(); t = read();k = (t == 0 ? P-k : k);for(int i = 0; i < n; i++) a[i] = read();b[0] = 1; b[1] = P-1;Ln(b, c, n);for(int i = 0; i < n; i++) c[i] = mul(c[i], k);Exp(c, b, n);Mul(a, b, a, n);for(int i = 0; i < n; i++) printf("%lld ", a[i]);return 0;
}

P5488 差分与前缀和 解题报告相关推荐

  1. P5488 差分与前缀和(多项式/生成函数)

    P5488 差分与前缀和 对于这道题需要我们快速对一个数列求解前缀和和差分,那么我们利用生成函数的知识,就可以知道实际上等价于乘一个多项式,然后我们就有了一个ln和exp的方法,然后比较简短的方法就是 ...

  2. CodeForces-1016C Vasya And The Mushrooms(模拟+思维+前缀和的前缀和) 解题报告 Apare_xzc

    CodeForces-1016C Vasya And The Mushrooms(模拟+思维+二重前缀和 ) 解题报告 xzc 2019/4/7 这周周赛的C题:wyt学姐的恶意   这道题周赛的时候 ...

  3. 一中OJ #3509 七的倍数 [USACO Jan16,洛谷P3131] | 同余前缀和 | 解题报告

    一中OJ | #3509 七的倍数 [USACO Jan16 Silver , Subsequences Summing to Sevens] 时限 1000MS/Case 内存 128MB/Case ...

  4. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  5. 【解题报告】2021牛客寒假算法基础集训营4

    [解题报告]2021牛客寒假算法基础集训营4 前面的话 A :九峰与签到题 | 模拟 (签到题) B: 武辰延的字符串 | exKMP D :温澈滢的狗狗 | 二分 E: 九峰与子序列 | d p d ...

  6. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  7. 解题报告(五)组合计数(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  8. 解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 东南大学2004年程序设计第一届初赛解题报告

    东南大学2004年第一届逻辑算法大赛初赛解题报告 农夫三拳@seu                                                                    ...

最新文章

  1. 十四、进程互斥的硬件实现方法
  2. MTU(最大传输单元)
  3. aes算法的C语言实现代码,AES加密算法c语言实现代码
  4. 决策树--从原理到实现
  5. 谈谈产品开发团队的配置管理规则
  6. (JAVA)正则表达式
  7. 常用linux命令及图解(实践文档,小白都可以看得懂)
  8. tfs2015 生成与发布 配置
  9. Spring和SpringMVC父子容器关系初窥
  10. Python 批量重命名文件
  11. 常用 ajax js 表单
  12. 计算机的垃圾站是在硬盘,电脑垃圾回收站在哪里
  13. 滚动快门效应与果冻效应
  14. 关于特修斯之船(转自知乎)
  15. erlang io:format io_lib:format
  16. sketch html插件,玩转Sketch,不容错过的5大实用插件推荐
  17. Windows下HdWiki安装步骤
  18. 水果(map的二维应用)
  19. Quorum (分布式系统)
  20. HDU 5761 Rower Bo 物理题(积分求时间)

热门文章

  1. autocad不能画图_AutoCAD三维入门,这些硬核干货要知道,看不懂建议备份收藏
  2. Whale 帷幄 CGO 管鹤荣:SDP尽显场域数据价值
  3. pyqt5开发桌面应用时如何使用pymysql连接数据库
  4. 2022-2028全球机架风扇托盘行业调研及趋势分析报告
  5. termux实现自动刷QQ福气袋
  6. 【自然语言处理】汉语词义自动消岐系统
  7. CANOpen系列教程01_初识CAN与CANOpen及相关内容
  8. HTML特殊字符编码对照表大全
  9. 记一次SOFA内存泄漏排查过程
  10. 链上富人寻「隐私」记(一:Mixer 篇)