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
有若干个二元组 \((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\),在开头和结尾插入删除就直接在这两个栈中分别 push
和 pop
.
如果出现删除时某个栈空了,那么直接暴力重构这两个栈使得这两个栈大小之差最小 .
设 \(w\) 为两栈的大小之差,那么一次正常的插入删除只会让 \(w\) 变化 \(1\),而重构平均分配的操作会用 \(\Theta(w)\) 的复杂度使 \(w\) 变成 \(0\) 或 \(1\),于是均摊时间复杂度是 \(O(m)\) 的 .
注意到要维护的一个东西是背包,于是考虑怎么在栈上维护背包 .
考虑 DP,求答案时维护一个数组 \(t_{i,j}\) 表示 \([i,i+2j]\) 中 DP 值的最大值,查的时候枚举选的个数然后分讨一下求 max 即可 .
这部分可以滑动窗口 .
于是时间复杂度 \(O(mp)\) .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16491530.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ