【省选模拟】数学专题
1.3
young
先把期望换成求所有情况的和
一个套路的想法是设 \(f(n,m)\) 表示 \(n\) 个点权值范围 \(2^m\) 的最小生成树权值和,记 \(s\) 为二进制第 \(m\) 位为 \(0\) 的点集,\(t\) 为 \(m\) 位为 \(1\) 的,将权值和分为三部分:\(s,t\) 之间连边和 \(s,t\) 各自内部
设 \(g(s,t,m)\) 为使点集 \(s,t\) 联通的权值和,\(h(s,t,m,k)\) 为 \(s,t\) 之间最小边边权 \(\ge k\) 的方案数,则有 \(g(s,t,m)=\sum_{i=1}^{2^{m}-1}h(s,t,m,i)\)(最小值转方案数的经典套路,见过好多次但总想不起来。。。)
考虑转移 \(f\),先枚举 \(|s|=i\)
若 \(|s|=0\) 或 \(|t|=0\),边权第 \(m\) 位一定是 \(0\);否则使 \(s,t\) 联通至少会有 \(2^{m-1}\times2^{(m-1)n}\) 代价(所有点低于 \(m\) 位的权值随便选)。再加上更低位的权值 \(g(s,t,m-1)\)
\(s\) 内部的边权和为 \(f(i,m-1)\times2^{(m-1)(n-i)}\),\(s\) 内部连边的第 \(m\) 位一定是 \(0\),乘 \(2\) 的幂是因为 \(s,t\) 是独立计算的,所有可能的 \(t\) 集都会让 \(s\) 集贡献 \(f(i,m-1)\),\(t\) 同理
接着考虑转移 \(h\),枚举 \(s,t\) 中第 \(m\) 位为 \(0\) 的点数 \(i,j\),根据 \(k\) 的第 \(m\) 位分类讨论:
若 \(k\) 的第 \(m\) 位 \(0\),\((i,j)\) 和 \((|s|-i,|t|-j)\) 的方案互不影响,直接把两部分乘起来
否则因为选的是最小边,一定只有 \(i=0,j=|t|\) 或 \(i=|s|,j=0\) 两种情况,结果为 \(2h(s,t,m-1,k\oplus2^{m-1})\)
整理一下:
注意一下边界,对于 \(f,g\),一边点数为 \(0\) 或权值范围为 \(0\) 时显然是 \(0\),但对于 \(h\),认为 \(m=0\) 时有一种方案,一边点数为 \(0\) 时不可能联通(权值为 \(\inf\)),另一边可以任选
时间复杂度 \(O(n^{4}2^{m})\),常数较小,实现上采用记搜即可
code
const int N = 55;
int n,m;
LL pw[455],C[N][N];
gp_hash_table<int,int> f[N],g[N][N],h[N][N][10];
LL H(int s,int t,int m,int k) {
if( s > t ) swap(s,t);
if( !m ) return 1;
if( !s ) return pw[m*t];
if( h[s][t][m].find(k) != h[s][t][m].end() ) return h[s][t][m][k];
if( k>>m-1 & 1 ) return h[s][t][m][k] = 2 * H(s,t,m-1,k^(1<<m-1)) %mod;
LL res = 0;
For(i,0,s) For(j,0,t)
(res += C[s][i] * C[t][j] %mod * H(i,j,m-1,k) %mod * H(s-i,t-j,m-1,k)) %=mod;
return h[s][t][m][k] = res;
}
LL G(int s,int t,int m) {
if( s > t ) swap(s,t);
if( !s || !m ) return 0;
if( g[s][t].find(m) != g[s][t].end() ) return g[s][t][m];
LL res = 0;
Rep(i,1,endi, endi = 1<<m) ckadd(res,H(s,t,m,i));
return g[s][t][m] = res;
}
LL F(int n,int m) {
if( n <= 1 || !m ) return 0;
if( f[n].find(m) != f[n].end() ) return f[n][m];
LL res = 0;
For(i,0,n)
(res += C[n][i] * (pw[(n-i)*(m-1)]*F(i,m-1)%mod + pw[i*(m-1)]*F(n-i,m-1)%mod + (i&&n-i)*pw[(m-1)*(n+1)]+G(i,n-i,m-1))) %=mod;
return f[n][m] = res;
}
signed main() {
pw[0] = 1; Rep(i,1,455) pw[i] = pw[i-1] * 2 %mod;
Rep(i,0,N) For(j,C[i][0]=1,i) C[i][j] = (C[i-1][j-1] + C[i-1][j]) %mod;
read(n,m);
write(F(n,m)*Pow(pw[n*m])%mod);
return ocl();
}
Simple
其实是套路题,赛时最后才会做没 rush 完有点难受
考虑「钦定」的本质就是 \(X\) 在它所有循环同构中严格最小,「严格」意味着不能有 \(<n\) 的循环节,除去这些数。剩下的数旋转 \(0\) 到 \(n-1\) 次都不相同,这 \(n\) 个数字中只有字典序最小的合法,因此答案为
其中 \(f(i)\) 表示 \(i\) 位数字不循环的数字个数,设 \(g(i)\) 为 \(i\) 为数字个数,可以通过 \(g(i)=10^{i}=\sum_{d\mid i}f(d)\) 反演得到
然后莫比乌斯反演一下,构造 \((id\cdot\mu)*id=I\) 杜教筛即可
1.6
猜拳游戏
带平局的情况可以看做一直打到分出胜负为止,因此每轮胜率为 \(\frac{w}{w+l}\)
设 \(a[i]\) 为净胜 \(i\) 轮时的游戏胜率,如果求出每轮胜率,有 \(a[m1]=1,a[-m_{2}]=0,a[i]=\frac{w}{w+l}a[i+1]+(1-\frac{w}{w+l})a[i-1]\),高斯消元即可
求 \(\max\frac{w}{w+l}\),等价于求 \(\max\frac{w}{l}\),考虑 \(01\) 分数规划。
现在要判断 \(w-l\times mid\ge0\) 是否合法,可以设 \(f[i,j]\) 为第 \(i\) 局前净胜 \(j\) 局的最大得分,胜一局记 \(1\) 分,输一局记 \(-mid\) 分,枚举出剪刀/石头/布转移,倒序 DP(因为 \(f[n+1,j]\) 的值显然),判断 \(f[1,0]\) 是否 \(\ge0\) 即可
B君的回忆
显然可以将内层的 \(g\) 对当前层的循环节取模,从而递归求解,关键在于求循环节
不难发现 \(g\) 是类斐波那契数列(ys 声称 \(g(n)=fib_{2i}(b)-fib_{2i-2}(a)\)),因此 \(g\mod p\) 的循环节大约在 \(3p\)。而循环节的本质是转移矩阵的若干次幂等于单位矩阵,可以 BSGS 求,直接实现大约是 \((2^{3}Tk\sqrt{p})\),考虑优化
- 如果 \(\gcd(a,b)=1\),\(len(a,b)=\text{lcm}(len(a),len(b))\)(\(len(p)\) 为模 \(p\) 下循环节),可以将模数分解质因数后记忆化
- BSGS 时先判一下 \(p-1,p+1\) 是否是解(大概率是)
- 矩阵只有 \(2\times2\),相关运算都可以循环展开
还有两个不会证的结论:
- 对于质数 \(p\),\(len(p^{c})=len(p)p^{c-1}\)
- 递归常数次后就会出现 \(len(p)=p\)
采用前 \(3\) 个优化就可以做到最大点 \(<50\)ms
小H爱染色
枚举第一个被染的球,则答案为 \(\displaystyle\sum_{i=1}^{n}F(i-1)(2{n-i\choose m-1}{n-i\choose m}+{n-i\choose m-1}^{2})\),这是个 \(3m+1\) 次多项式,可以做到 \(O(m^{2})\) 插值,但没有优化空间
一个比较神奇的做法是把 \(F(x)\) 展开为 \(\sum_{i=0}^{m}f_{i}x^{i}\)
记 \(G(i)\) 为给 \(i\) 个球染两次色,每次染 \(m\) 个,第一个必须染的方案数,则有 \(\displaystyle G(i)=\sum_{j=m}^{2m}{i\choose j}{j\choose m}{m\choose 2m-j}\)(枚举染了色的球数 \(j\),\({j\choose m}{m\choose 2m-j}\) 表示第一次随便染 \(m\) 个,第二次染 \(2m-j\) 个染过的)。则答案为
把 \(i^{j}\) 用第二类斯特林数展开
\(\sum_{i=0}^{n-1}{i\choose l}{n-i\choose k}\) 其实就是 \({n\choose k+l}\)(从 \(n\) 个球中选 \(l+k\) 个染,\(i\) 是后面 \(k\) 个球的第一个),这样就不需要枚举 \(i\) 了(此处存疑。可以确定 \(\sum{i\choose a}{n-i\choose b}={n+1\choose a+b+1}\) 是对的,相当于新增一个球作为分界点)
再把 \({j\brace l}\) 展开
先对最后一个 \(\sum\) 卷一次,然后和只与 \(k\) 相关的卷,最后枚举 \(k+l\) 求和,有点卡常(也许是我 NTT 板子太慢了)
1.7
宇宙序列
异或卷积具有结合律,可以倍增,时间复杂度 \(O(pn2^{n})\)
根据 DFT 性质,可以只求点值和,然后做一次 FWT,问题变为求 \(\sum_{i=0}^{p}j^{2^{i}}\)
发现模数很小,可以 \(mod^{2}\) 求 \(2^{i}\) 的循环节
正解是倍增。设 \(f[i,j]=\sum_{k=0}^{2^{i}-1}j^{2^{k}}\),显然有 \(f[i,j]=f[i-1,j]+f[i-1,j^{2^{2^{i-1}}}]\)
个人感觉答案不太好统计,解释一下。由于 \(f[i,j]\) 取不到 \(2^{i}\),先将 \(p\leftarrow p+1\),计算时不取 \(p\)。然后类似快速幂扫每一位,对于为 \(1\) 的位(第 \(i\) 位,记 \(s[i]=(2^{i}-1)\oplus p\),\(\oplus\) 表示 &
)累加 \(\displaystyle f[i,x^{2^{s[i]}}]\)。\(x\) 需要次幂是因为这一位需要累加的贡献是 \(\sum_{j=s[i]}^{s[i]+2^{i}-1}x^{2^{j}}\),而 \(f[i,x]\) 是从 \(x^{2^{0}}\) 开始的
时间复杂度 \(O(mod\log p+n2^{n})\)
exp
对于区间 \([l,r]\),找出其中一个 .
的下标 \(k\),那么如果 \(k\) 是该区间中最后一个被选的,\([l,k],[k+1,r]\) 互不影响,可以据此 DP。
设 \(f[l,r]\) 为区间 \([l,r]\) 中 \(s_{r}=\) .
,消掉 \([l,r)\) 中所有 .
的期望(\(r\) 未消),\(g[l,r]\) 为概率,\(p(l,r,k)\) 为 \(s_{k}=s_{r}=\) .
,消掉 \([l,r)\) 中 .
且 \(s_k\) 为最后一个消(\(r\) 未消)的概率,则有
即枚举 \([l,r)\) 中最后一个被消的是哪个
其中 \(lc,rc\) 表示 \([l,k),(k,r)\) 中 .
的个数。组合数是确定这 \(lc+rc\) 个 .
消的顺序,\((\frac{k-l+1}{r-l+1})^{lc}\) 是 \(lc\) 次选中 \([l,k]\) 的概率,再乘上这 \(lc\) 次恰好消完 \([l,k)\) 的概率 \(g[l,k]\),最后一次消掉 \(k\) 的概率为 \(\frac{k-l+1}{r-l+1}\)
\(\frac{p(l,r,i)}{g[l,r]}\) 本质是加权平均,\(\frac{i-l}{2}\) 是最后一次消掉 \(i\) 对期望的贡献。(设 \(E(i)\) 为 \([1,i]\) 中仅有 \(i\) 位置为 .
,一次操作消掉 \(i\) 的期望,则有 \(E(i)=\frac{1}{i}\sum_{j=0}^{i-1}=\frac{i-1}{2}\),代入 \(i-l+1\) 可得)
破环成链后枚举最后一个被消掉的位置 \(i+n-1\),同样需要加上 \(E(n)\)(注意特判全是 X
的情况)
实现上组合数、次幂直接用 double
算即可,玄学原因不会掉太多精度(但一定不能用 <cmath>
库的 pow
,精度常数都爆炸)
1.8
传统题
设 \(f(ans=i)\) 为最长连续相同子段长度 \(=i\) 的方案数,则答案为
考虑计算 \(\sum_{i=1}^{n-1}f(ans\le i)\)。枚举连续相同子段数 \(j\),那么要求这 \(j\) 段中相邻两端颜色不同,每段长 \(\le i\),总长为 \(n\)。后两个条件等价于 \(\sum x_{j}=n,\forall x_{j}\le i\),是经典容斥
枚举 \(i,k\) 的复杂度是 \(O(n\ln n)\) 的,考虑去掉 \(j\)。有两种做法:
- 组合意义
- 二项式定理
记 \(t=n-ik\)。
只看 \(\sum\) 后的,把 \(j+k\) 拆开,下以 \(j\) 为例
推导过程中时刻想着如何消掉 \(j\)。大致思路是先尽量分离来简化 \(\sum_{j}\) 后的式子,再通过 \(\sum_{j}(m-1)^{?(j)}{t-k\choose ?(j)}\) 构造二项式定理
个人感觉推式子比组合意义逻辑连贯,不易出错,更适合我这种弱智选手
生成树
变元矩阵树定理求出的是所有生成树边权积之和,那么将红绿蓝的边权分别设为 \(1,x,y\),矩阵树定理得到的多项式中 \(x^{i}y^{j}\) 的系数就是恰好有 \(i\) 条绿边、\(j\) 条蓝边的生成树数量,但我们只能通过行列式求值得到 \(\sum_{i=0}^{g}\sum_{j=0}^{b}f_{i,j}x^{i}y^{j}\)
不难发现该多项式有 \(\frac{n(n-1)}{2}\) 个系数(\(i+j<n\)),那么带等量点值进去做二维拉格朗日插值即可,由于常数小且不满,高斯消元也可水过
最短路径
树上路径唯一,可以点分治+NTT,但基环树上需要考虑最短路如何绕环
设环长为 \(len\),中点为 \(mid\),破环成链,那么 \([1,mid],[mid+1,len]\) 内部点之间的最短路一定在区间内,朴素分治解决。
将 \([1,mid],[mid+1,len]\) 分别均分为两个区间,从左到右记作区间 \(1,2,3,4\)。
区间 \(2,3\) 之间点的最短路一定经过边 \((mid,mid+1)\),区间 \(1,4\) 之间点的最短路一定经过边 \((1,len)\),可以直接计算
而区间 \(1,3\)、区间 \(2,4\) 之间点的最短路是类似的子问题,递归求解
时间复杂度不会证,目测是 \(O(n\log^{2}n)\)
总结
问题有点大,经常一道题都不会做就开始摆烂,打的最低分暴力还总挂。还有思维混乱,不成体系,见到熟悉的东西意识不到。。。
学的时候只背结论不求证明也是个隐患
省选题确实难,事实上每天能切题的人也不多,拼的还是暴力,也许确实该调整心态&策略了,希望 WC 前能恢复状态