codeforces 数学博弈论 100 题 30 天专项训练
害怕结果还是害怕错过,
问自己,
一句我在怕什么,
如果没有明天给我浪费和沉默...
Day 1
1265B
思路 1 从某个 \(a_i\) 出发
- \(m\) 是美丽数字等价于存在长度为 \(m\) 的连续区间是 \(1,2,...,m\) 的排列。
- 若 \(a_i=m\),计算最小的 \(l(\le i)\) 与 \(r\ge i\),使得 \(\max\limits_{l\le i\le r}a_i=m,\)则 \(m\) 是美丽数字等价于 \(r-l+1=m\)。
思路 2 从美丽数字出发
- \(m\) 是美丽数字等价于 \(\max\limits_{1\le i\le m}pos_i-\min\limits_{1\le i\le m}pos_i=m-1\)。
1215B
思路 1
- 考虑以 \(i\) 为结尾的正子串个数 \(pos_i\) 与负子串个数 \(neg_i\)。
- 可根据 \(a_i\) 的正负,分类讨论转移。
思路 2
- 预处理前 \(i\) 个数字乘积的正负性。
Day 2
1285C
思路
- 一定存在互质的 \(a,b\) 使得:\(\max(a,b)\) 最小且 \([a,b]=x\)。
- 因此,只需枚举 \(x\) 的所有因子 \((d,\frac{x}{d})\)。
1295D
思路
- 令 \(d=\gcd(a,m)\),则 \(d|(a+x)\),进而 \(x=kd,0\le k< m',m'=\frac{m}{d}\)。
- \(d=\gcd(a+x,m)=\gcd(a+kd,m)=d\gcd(k+a',m'),a'=\frac{a}{d}\),即求 \(\gcd(k+a',m')=1\) 的 \(k\) 的个数。
- \(k+a'\in[a',m']\cup[m',a'+m'-1]\)。
- \(\forall m'+l \in [m',a'+m'-1]\),\(\gcd(m'+l,m')=\gcd(l,m')\)。
- 因此求,\(\gcd(x,m')=1\) 的 \(x\) 的个数,即欧拉函数在 \(m'\) 处的取值。
\(\mathcal O(\sqrt{n})\) 求 \(m\) 处的欧拉函数值
点击查看代码
for(int i=2;i*i<=m;i++){
if(m%i==0){
ans=ans/i*(i-1);
while(m%i==0) m/=i;
}
}
if(m>1) ans=ans/m*(m-1);
510D
思路
- 当指定选取 \(a_i\) 时,只需考虑 \(a_i\) 涉及到的质因子。
- 枚举指定选取元素 \(a_i\)。
Day 3
407B
思路
- 令 \(dp_i\) 为第一次到 \(i\) 所需要的步数。
- \(dp_{i+1}\) 则可模拟为:第一次到 \(i\) + 从 \(i\) 到 \(p_i\) 的 \(1\) 步 + 从 \(p_i\) 回到 \(i\) 的步数 + 从 \(i\) 到 \(i+1\) 的一步。
- 难点在于发现:从 \(p_i\) 回到 \(i\) 的步数等于 \(dp_i-dp_{p_i}\)。