2024.7.29 test
A
给出 \(n,m\),你要求对于所有长度为 \(n\) 的非负整数序列 \(A,B\) 中,满足 \(\sum A_i=\sum B_i=m\),
求 \((\sum |A_i-B_i|)^2\) 的总和。\(n\le 500,m\le 10^5\)。
首先我们发现 \(\sum (A_i-B_i)=0\),所以 \(\sum |A_i-B_i|=2\sum_{A_i<B_i} B_i-A_i\)。
我们把序列分为两部分,一部分是 \(A_i\ge B_i\) 的,另一部分是 \(A_i<B_i\) 的。
枚举第一部分有多少个数,并枚举 \(j=\sum_{A_i<B_i}B_i-A_i\) 的值,插板并组合起来即可。
要是最后和不等于 \(m\) 怎么办?对于 \(A_i\ge B_i\) 的,我们令 \(B_i=0\),\(A_i<B_i\) 的令 \(A_i=0\)。
那么我们把多出来 \(m-j\) 的部分分配给 \(n\) 个位置即可。
B
\(n\) 个点的有向图,时刻 \(t_i\) 在某个点出现一个人,共 \(m\) 个人,每个人在每个时刻随机游走。
问对于 \(1\sim T\) 每个时刻第 \(n\) 个节点的期望人数。\(n\le 70,m\le 10^4,T\le 2\times 10^6\)。
我们发现每个时刻的答案都需要求出。但是从 \(t\) 到 \(t+1\) 是要 \(O(n^2)\) 的转移的。不如写成矩阵形式。
考虑把若干个一起转移,那么我们分块,块长为 \(B\),那么预处理出 \(M^1\sim M^B\) 转移矩阵。
从 \(kB\) 转移到 \((k+1)B\) 是向量乘矩阵是 \(O(n^2)\) 的。
注意到我们是单点查值,而单点查询是 \(O(n)\) 的。所以复杂度是 \(O(n^3B+n^2\frac{T}{B})\ge O(n^{5/2}\times T^{1/2})\).
那么 \(m\) 个人怎么办,我们从这 \(m\) 个点开始再做一遍 \(M^1\sim M^B\) 的转移。
C
在平面上,初始位于 \((0,0)\),沿着给定长度为 \(n\) 的轨迹(支持上下左右走)走到 \((a,b)\),并重复走 \(k\) 次。
问最后经过多少个不同的点,\(n\le 10^5,k\le 10^{12}\)。
我们考虑哪些点会重复,设第一次经过的点有 \((x,y)\),那么 \((x+ka,y+kb)\) 的点也会被走到。
我们要求有多少种等价的点,等价的点是满足 \((x_1,y_1)=(x_0+ka,y_1+kb)\) 的。
如何求这个,不如把所有点按 \((x\bmod a,y\bmod b)\) 归类即可。
D
给定序列 \(B\),维护序列 \(A\),支持区间赋值,区间查询 \(\min \frac{lcm(A_i,B_i)}{\gcd(A_i,B_i)}\)。\(n,q,A_i,B_i\le 10^5\)。
我们要求的就是 \(\min \frac{ab}{\gcd^2(a,b)}\).
考虑分块,现在要考虑的是把一个块内的 \(A_i\) 都改成 \(v\),维护答案。
那么我们枚举 $\gcd $,一个桶内维护 \(Mn_d\) 表示有 \(d\) 因子的最小值即可。