今天才知道这个词这么逆天,还是别放中文了。アイデン貞貞メルトダウン
アリ!?ナシ!? ナシ!?アリ!?
ついてる ついてない あれどっち?どっち?Trance, trance, trance
蟻!?梨!? nAシ!?ァ理!?
自我 字が 崩壊!
インドア警備隊 紫外線さよなら
(バイバイ alright! 一級在宅 allday!)
やる気の“や”の字 どっかにいっちゃったんだ
ナイナイ 心技体 実家に帰ります)
ああ 未知なる世界と目があったよ
微笑んで 手招きしてるの
ねえ こっちの水はスウィーツパラダイス
おしゃれ メイク ヘアアレンジ
乙女の園で ダンスした
あれ わたし(Who!)
誰(Are!)
オレOleお?((It’s me!)
知らない 何 壊れそうな アイデン貞貞
産まれたばかり a sense of wonder
そのまま maybe 溶けてゆく 深層心理
目覚め
たまえ
眠れるアイツ
いくとこまで いってみようか ハッピーエンド?
アリ!?ナシ!? ナシ!?アリ!?
ついてる ついてない あれどっち?どっち?Trance, trance, trance
蟻!?梨!? nAシ!?ァ理!?
自我 字が 崩壊!
おさんぽ調査団 瀕死でおかえり
へイへイ fall down! 三流散策 weekend!)
やる気を出した 結果が大変だった
(累々 死屍die! ファイト一発)
ああ マジカルウルトラスーパーミラクル
抱きしめて 慰めてくれよ
ええ そんなの夢さ ドリームワンダーランド
地道 努力 コツコツ
正論マンが パンチした
やれ右(Uh!)
右(Hah!)
左右!(ワンツー!)
いらない 愛つよがりな アイデン貞貞
素直になりなさい catch on fire
わがまま baby 解けてゆく 固定観念
ふるい
たまえ
内なるケモノ
自分自身を知るための 決闘だ
白か黒かで決めた(オセロ!)
0か100しかないの?(極論!)
生きづらい俗世だね(娑婆ばい!)
神様 仏様 この私目にお導きを...
それでいいのか(YES! NO!) アイデンティティよ
目を覚ませ!
sosdp,FMT,FWT 上
FWT 和一些难点的题放到下次写。
sosdp
首先考虑最基本的问题:
定义集合 \(U\subseteq R,X=\{S|S\subseteq U\}\),定义函数 \(f:X\to R,g(S)=\sum\limits_{T\subseteq S} f(S)\),对于所有的 \(S\in U\) 求 \(g(S)\),\(n=|U|\le22\)
首先暴力枚举 \(S,T\) 是 \(n^4\) 的,考虑优化。
-
子集枚举:
考虑将集合抽象成二进制,求 \(S\) 的子集相当于枚举其所有掩码,有代码:
for(int t=s;t;t=(t-1)&s)
这里 \(t\) 是 \(s\) 的子集。解释就是
t-1
每次将t
最后一个一置零,后面全置一,与上 \(s\) 可以去除掉多余部分,显然 \(t\) 降序遍历 \(s\) 掩码。暴力枚举 \(s\),复杂度是 \(3^n\) 的。
-
高维前缀和:
我们发现子集枚举并没有很好的利用信息之间的可合并性,发现将二进制每位拆成一维,其相当是高维前缀和,有代码:
for(int i=0;i<n;++i) for(int j=0;j<1<<n;++j) if(j>>i&1) f[j]+=f[j^1<<i];
解释:考虑求二维,三维,四维前缀和时,有简单的做法是每次枚举一维做前缀和,其实代码就是在枚举第 \(i\) 维和当前状态 \(j\),在加上去。
复杂度 \(n2^n\)
没错,这就是 sosdp,其实就是递推求前缀和。
会了前缀和还要会差分,容易想到将循环变向,加变减即可,考虑到每维的大小只有 \(2\),所以循环反不反向都无所谓啦。
高维后缀和、差分也类似,考虑其是把 \(1\) 加到零上,将 if(j>>i&1)
改成 if(!(j>>i&1))
就好了。
先就此打住,做一个还算有点意思的板子:CF449D Jzzhu and Numbers
solution
考虑恰好都是 \(0\) 不好做,考虑容斥,求钦定有 \(x\) 个一的方案数。
考虑转而枚举 \(k\) 满足 \(k\) 是最后 \(\And\) 的结果一个子集,会发现其相当于是每个数的子集,求二维后缀和即可。
快速莫比乌斯变换(FMT)
注意和莫比乌斯变换区分。
板子:
给定两个集合上的函数 \(f,g\) 求 \(h(S)=\sum\limits_{I\circ J = S} f(I)*g(J)\),其中 \(\circ\) 可以是 \(\cup\) 和 \(\cap\)。
考虑先做并,先对 \(f,g\) 做前缀和,在计算 \(h'(S)=f(S)*g(S)\),然后对 \(h'\) 做前缀差分,根据定义,其就是 \(h\)。
虽然我并不会 FTT,但不影响题解让我发现,这个操作和 FTT 的 DFT 很像——同样是对一个函数作运算得到另一个函数,然后用运算完的操作进行按位求积,最后再进行反向操作将其变换为原函数。而整套流程下来,实现了卷积的效果,所以这个也叫 OR 卷积,在原函数和新函数间建立双射的操作,被称作“快速莫比乌斯变换 Fast Mobius Transform(FMT)”。
类似可以做 AND 卷积,用后缀操作代替前缀,可以解决交的问题。
复杂度是 \(n2^n\),但是考虑设 \(n\) 表示 \(S\) 的总方案数,在一般的二进制中就是原数的大小,复杂度是 \(n\log n\) 的——和 FFT 一样。
与 AND 和 OR 类似的,其实 XOR 的卷积也是可以做的,但是要用到 FWT,并且因为其结构更像 FFT,因此更难写。