2022.7.18 闲话

看一本 DK 科普书籍中的完全背包题,口胡一波生成函数还胡错了(忘取倒数 QAQ)


Problem 1

题目来源:EI 群 .

对于 \(\gcd(a,b)=1\),问什么样的 \(n\) 能使得 \(n\times n\) 的大正方形可以划分为若干个 \(a\times a\)\(b\times b\) 的小正方形(各至少一个,且必须是正着摆,不能倾斜).

答案:\(a\mid n\)\(b\mid n\) .

必要性显然 .

充分性证明如下:

\(i\)\(j\) 列位置赋值 \(\omega_a^i\cdot \omega_b^j\),则所有小正方形权值和为 \(0\)(因为单位根事循环的),从而大正方形权值和为 \(0\) .

然后提一下公因式即得 \(a\mid n\)\(b\mid n\) .

证毕 .

Problem 2

给一个正整数 \(n\),求:

\[F(n)=\left(\sum_{d\mid n}d\right)\bmod 2 \]

\(n<2^{128}\) .

结论:\(F(n)=1\) 当且仅当存在 \(r\in\mathbb N\)\(k\in\mathbb N_+\) 使得 \(n=2^r\cdot k^2\) .

证明可以考虑数学归纳法(确信).

Problem 3

LOJ6515 贪玩蓝月

有若干个二元组 \((w,v)\),定义一组二元组的特征值为 \(w\) 之和,价值为 \(v\) 之和 .

维护一个双端队列,支持:

  • IF w v,在开头插一个二元组 \((w,v)\) .
  • IG w v,在末尾插一个二元组 \((w,v)\) .
  • DF w v,弹开头的二元组 .
  • DG w v,弹末尾的二元组 .
  • QU w v,选取若干二元组,令其特征值为 \(s\),使得存在一个 \(t\in[l, r], s\equiv t\pmod p\),最大化价值,只需输出最大的价值 .

强制在线 .

\(m\le 50000\)\(p\le 500\) .

用两个栈模拟一下双端队列 .

维护两个栈 \(F\)\(G\),在开头和结尾插入删除就直接在这两个栈中分别 pushpop .

如果出现删除时某个栈空了,那么直接暴力重构这两个栈使得这两个栈大小之差最小 .

\(w\) 为两栈的大小之差,那么一次正常的插入删除只会让 \(w\) 变化 \(1\),而重构平均分配的操作会用 \(\Theta(w)\) 的复杂度使 \(w\) 变成 \(0\)\(1\),于是均摊时间复杂度是 \(O(m)\) 的 .

注意到要维护的一个东西是背包,于是考虑怎么在栈上维护背包 .

考虑 DP,求答案时维护一个数组 \(t_{i,j}\) 表示 \([i,i+2j]\) 中 DP 值的最大值,查的时候枚举选的个数然后分讨一下求 max 即可 .

这部分可以滑动窗口 .

于是时间复杂度 \(O(mp)\) .

posted @ 2022-07-18 18:36  Jijidawang  阅读(96)  评论(2编辑  收藏  举报
😅​