A. 楼房搭建
题意:有 \(n\) 个数 \(a_{1...n}\),以及初始全是 \(0\) 的 \(b_{1...n}\)。现在每次选择一个 \(i\in[1,n-1]\),然后选择下面一个操作:
-
\(a_i\gets a_i+1, \space a_{i+1}\gets a_{i+1}+2\)
-
\(a_i\gets a_i+2, \space a_{i+1}\gets a_{i+1}+1\)
求使得 \(\forall i,b_i\ge a_i\) 的最小操作次数。 \(1\le n\le 10^6\)
最小操作次数相当于使得操作后 \(\sum\limits_{i=1}^n (b_i-a_i)\) 最小,称这是溢出来的部分。
显然有一个 dp:设 \(f[i,j]\) 表示处理了前 \(i\) 个数,并且除了 \(b_i\) 其他都达到要求,且 \(b_i\) 还需要加 \(j\) 才能到达 \(a_i\),此时我们溢出来的和的最小值。
考虑从 \(f[i-1,j]\) 到 \(f[i,]\) 的转移。转移采用贪心思想,我们一定不会在此时给 \(i-1\) 多加数,宁愿让 \(i\) 多留出一些,因此可以枚举两种操作分别多少次。
画一下发现 \(b_i\) 最多加 \(2j\)(每次给 \(b_{i-1}\) 加一,给 \(b_i\) 加二),当 \(j\) 为偶数时最少加 \(\frac j2\)(每次给 \(b_{i-1}\) 加二,给 \(b_i\) 加一),当 \(j\) 为奇数时最少加 \(\frac{j-1}2+2\)(留一次给 \(b_{i-1}\) 加二,\(b_i\) 加一,其余给 \(b_{i-1}\) 加一,\(b_i\) 加二),而且 \(j=1\) 时也是成立的。。
手玩一下,我们能给 \(b_i\) 加的数总和呈一个公差为 \(3\) 的等差数列,首项为 \(l\),末项为 \(r\)。而 \(b_i\) 减去数列中每一个数,便是能更新到的状态,因此不妨猜测状态也是一个公差为 \(3\) 的等差数列。
相邻两个状态 \(x,x+3\) 能更新到的最大状态为 \(b_i-2x,b_i-2(x+3)=b_i-2x-6\),仍然满足差值是 \(3\) 的倍数。而且只有 \(1\) 这一个状态更新一个,其他状态都能更新至少两个,这些更新到的状态是连续的,所以我们的猜测成立。
可是每个状态对应的最小值不会不一样吗?其实是一样的,考虑什么时候 dp 转移时会加东西,必然是在消除 \(b_{i-1}\) 的前提下,\(b_i\) 他溢出了,此时我们可以令能更新到的状态为 \(0\) 这一个(\(b_i\) 还需要加 \(0\) 才能满足要求),发现此时 \(f[i,]\) 每个状态对应的最小值是一样的(因为只有一个状态),进一步即可得出每个状态的值都一样。
因此,我们只需要储存 \(l,r\) 表示当前 dp 数组的状态等差数列的首项和末项,时间复杂度 \(O(n)\)。
B.手链强化
题意:一个 \(n\) 个点的环,以及 \(k\) 种非白色的颜色,一开始所有点为白色。每次把一个点涂成任意一种颜色(会覆盖之前的颜色),然后把相邻的点涂成白色。经过任意次操作后,环的状态有多少种(旋转后相同算同一种),模 \(10^9+7\)。 \(1\le n,k\le 10^9\)
考虑 Polya 定理,枚举每个置换,相当于枚举这个环旋转的次数 \(i\)。大环会形成 \(\gcd(i,n)\) 个子环,每个子环颜色都一样。
可知最终状态非白点不相邻,并且都能达到。对于连续 \(\gcd(i,n)\) 个点,每个点各属一个子环,我们只需要满足这些点拎出来构成的环中,非白点不相邻。
设 \(g(m)\) 表示 \(m\) 个点构成的环非白点不相邻的方案数,答案为
\[\frac 1n\sum_{i=1}^n g(\gcd (i,n)) \]化一下
\[\begin{aligned} & \space\space\space\space\space\space\frac 1n\sum_{i=1}^n g(\gcd (i,n)) \\ &= \frac 1n\sum_{d|n} g(d)\sum_{i=1}^{\frac nd} [\gcd(i\cdot d,n)=1] \\ &= \frac 1n\sum_{d|n} g(d)\sum_{i=1}^{\frac nd} [\gcd(i,\frac nd)=1] \\ &= \frac 1n\sum_{d|n} g(d)\cdot \varphi(\frac nd) \end{aligned} \]\(\frac nd\) 太大,欧拉函数不好算。把 \(n\) 分解质因数,dfs 每个质因子来枚举约数,边 dfs 边计算当前约数的 \(\varphi\)。
最后的问题:如何计算 \(g(m)\)?
断环为链,设 \(f(m)\) 表示一条长度 \(m\) 的链的答案。钦定第一个点白色为 \(f(m-1)\),钦定最后一个点白色为 \(f(m-1)\),减去两个都白色 \(f(m-2)\),即 \(g(m)=2f(m-1)-f(m-2)\)。
对于 \(f\),有 \(f(m)=f(m-1)+k\cdot f(m-2)\),矩阵乘法随便搞搞就行。
时间复杂度 \(O(d(n)\cdot \log n)\)。
C.数字收藏
水题没有意义。
标签:状态,2024.2,frac,gcd,space,sum,16,nd,解题 From: https://www.cnblogs.com/Sktn0089/p/18016952