2022.7.19 闲话

约定:

  • fk(x)=(f(x))k .
  • L 是值域 .

2-SUM Counting

给一个序列 {an} 和一个正整数 k,问有多少对 (i,j)1i,jn)使得 ai+aj=k,对 998244353 取模 .

Algorithm 1 O(n2) 暴力 .

Algorithm 2 开一个桶,算出 tk=i=1n[ai=k],于是答案是

f(k)=i+j=ktitj

注意到是卷积形式,可以 NTT O(LlogL) 解决 .

Algorithm 3 开一个 Hash Table,把所有 ai 存进去,扫一遍在 Hash Table 里查询 kai 即可,最优 O(L) .


2-SUM Finding

给一个序列 {an} 和一个正整数 k,找一对 (i,j) 使得 ai+aj=k .

Algorithm 1 O(n2) 暴力 .

Algorithm 2 开一个 Hash Table,把所有 ai 存进去,扫一遍在 Hash Table 里查询 kai 即可,最优 O(L) .

更高的 SUM 问题仍可以 Hash Table 解决 .


3-SUM Multi-Counting

给一个序列 {an},对于每个 s[1,m],问有多少对 (i,j,k)1i,j,kn)使得 ai+aj+ak=s,对 998244353 取模 .

tk=i=1n[ai=k],于是答案是

f(s)=i+j+k=stitjtk

三元卷积非常牛逼哈,但是我们仔细观察就可以发现这个是可以拆成两次普通卷积的 .

多组询问非常平凡,具体的,令 F(z)=k0zktk,则对于一个 s,答案为 [zs]F3(z) .

两次 NTT,O(LlogL) .

更高的 SUM Counting 也可以这么解决 .


2D - 2-SUM Multi-Counting (Weak)

给两个序列 {an},{bn},多组询问,每次给一个 x,问有多少对 (i,j)1i,jn)使得 ai+aj=bi+bj=x,对 998244353 取模 .

开一个 Hash Table,每次存一个 pair (ai,bi) .

在值域上枚举 x,在 Hash Table 里查 (xai,xbi) 即可 .

时间复杂度最优 O(L) .


2D - 2-SUM Multi-Counting

给两个序列 {an},{bn},多组询问,每次给一对 x,y,问有多少对 (i,j)1i,jn)使得 ai+aj=xbi+bj=y,对 998244353 取模 .

严格强于今天模拟赛 T3(Common).

做法也是卷积,大概有两种 .

Algorithm 1

考虑把两个数压成一个数 .

首先定义 encode(a,b)=La+bL 比值域大一点 .

tk=i=1n[encode(ai,bj)=k],构造多项式:

F(z)=k0zktk

于是 [xencode(x,y)]F2(z) 即为答案,O(L2logL) NTT 即可 .

Algorithm 2

rk=i=1n[ai=k],tk=i=1n[bi=k] .

于是构造二元多项式:

F(z1,z2)=k10k20z1k1z2k2rk1tk2=k10z1k1rk1k20z2k2tk2

考察其卷积,可以发现两维分别卷积了 .

于是答案就是 [z1x,z2y]F2(z1,z2)(我也不知道这个二元的提取系数是不是这么写)

于是上一个 2D 的 NTT(具体的,先对每列做 DFT,再对每行做 DFT,然后点乘,然后对每行做 IDFT,最后对每列做 IDFT),就可以维护出 F2 了 .

类似的可以扩展到 kD .

这样:aD - b-SUM (Multi-)Counting 被解决 .


Finding 大概都可以 Hash 吧,口胡的没仔细想……

posted @   yspm  阅读(126)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示