训练指南做题记录
Chapter 2
HDU4746 Mophues
定义 \(f(n)\) 为 \(\gcd(x,y)=n(1\leq x\leq N,1\leq y\leq M)\) 的 \((x,y)\) 的个数,\(g(d)\) 为 \(d|\gcd(x,y)\) 的 \((x,y)\) 个数,即 \(\lfloor N/d\rfloor \lfloor M/d\rfloor\) .
令 \(T=kn\) ,有
前面整除分块,后面预处理即可。
另外,\(2^{19}\ge 5e5\) ,所以当 \(P\ge 18\) 的时候所有二元组的 \(\gcd\) 都满足条件。 Code
HDU5528 Count a * b
一个很显然的想法是求补集,令 \(h(m)\) 是 \(m|ab\) 的结果,那么 \(g(n)=\sum_{m|n}m^2-\sum_{m|n}h(m)\) .
然后推一波式子变成 \(\sum_{m|n}m^2-\sum_{d|n}n\) 。
UVA1482 Playing with Stones
SG 函数,可以先猜个结论:
然后归纳证明就好了。 Code
UVA10561 Treblecross
注意到如果不是走投无路不可能在 __X__ 这种情形中填任何一个格子,令 \(f(x)\) 表示 \(x\) 个连续空格的 SG函数值,那么有
(例如 \(f(x-3)\) 就是把新的放在最左边得到的结果)
直接递推,然后根据初始局面划分成若干个子游戏就完成第一问了。
对于第二问,枚举所有策略,使得后继 SG 为 \(0\) 的就是所求。
UVA11021 Tribbles
设对 \(m\) 天的答案为 \(f(m)\) ,有
UVA11762 Race to 1
令 \(f(x)\) 表示输入 \(x\) 的平均次数,\(p(x)\) 为不超过 \(x\) 的素数个数,\(q(x)\) 为其中是 \(x\) 因子的个数。
记忆化搜索。 Code
UVA10294 Arif in Dhaka(First Love Part 2)
先考虑旋转,考虑同一方向上旋转 \(0,i,2i,\cdot\) ,这个循环有 \(n/\gcd(n,i)\) 个元素,而所有循环长度相同,那么有 \(\gcd(i,n)\) 个循环,不动点个数为 \(a=\sum_{i=0}^{n-1}t^{\gcd(i,n)}\) 。
翻转:分奇偶讨论,偶数情况下,不动点总数为 \(b=\dfrac n2(t^{n/2+1}+t^{n/2})\) ;奇数情况下为 \(nt^{(n+1)/2}\) 。
Gym100722I Leonardo's Notebook
拆解循环,找平方的规律。 Code
UVA11077 Find the Permutations
考虑一个排列怎么算。例如,\((5,2,7,4,6,1,3)\) 这个排列,可以和 \((1,\cdots,n)\) 看成一个置换,分成四个循环:\((1,5,6)(3,7)(2)(4)\) ,大小为 \(x\) 的循环需要至少 \(x-1\) 次。
于是计算排列个数可以转化为 DP ,设 \(dp[i][j]\) 表示大小为 \(i\) 的排列中至少需要 \(j\) 次的个数,每次新加入一个元素可以自成一个循环也可以加入之前的循环的任意一个位置,转移方程是 \(dp[i][j]=dp[i-1][j-1]\times(i-1)+dp[i-1][j],f[1][0]=1\) 。
LA3704 Cellular Automaton
每次操作都能用矩阵表示,如果直接计算复杂度是 \(O(n^3\log n)\) 的,对于多测无法接受;但是注意到转移矩阵是循环矩阵,所以相乘的时候只需要乘一行,复杂度为 \(O(n^2\log n)\) 。Code
UVA11542 Square
把每个数质因数分解并将幂次对 \(2\) 取模。转化为异或方程之后消元即可。 Code
LA6886 Golf Bot
令 \(F(x)=\sum_{i=0}^{2e5} a_ix^i\) ,如果存在 \(k_j=i\) 那么 \(a_i=1\) ,否则为 \(0\) 。令 \(G(x)=F(x)*F(x)\) ,那么可以写出等价于系数非 \(0\) ,直接卷积。
Gym101239J Tile Cutting
就是加个 ST表的问题。UVA 和 LA 感觉有不合法数据,这里是 Gym 的提交。 Code
UVA13277 XOR Path
钦定 1 是根,计算所有节点到 1 的距离,一条路径的值就是两个 \(dis\) 的异或。由于要计数,容易想到用 FWT 解决。 Code
UVA10780 Again Prime? No Time.
分解 \(m\) ,然后再分解 \(n!\) ,就是小奥做容斥的那种方法。 Code
UVA11139 Counting Quadrilaterals
分为凹凸两类统计,如果一个点集可以构成凸四边形那么只有一种;否则是三种。统计所有点数和所有凹四边形数即可。 Code
Gym102482D Gem Island
相当于是 \(\sum_{i=1}^nx_i=d(x\in [0,d])\) ,方案数有 \(\binom{n+d-1}{n-1}\) ,设 \(dp[i][j]\) 是 \(i\) 个人,分裂 \(j\) 次的前 \(r\) 大之和(这里只考虑分裂产生贡献),方程为
UVA10673 Play with Floor and Ceil
UVA10951 Polynomial GCD
一看还以为是多项式高科技,后来发现是欧几里得 /xia Code
UVA11637 Garbage Remembering Exam
概率随便组合计数一下就好了,倒是这个精度很恶心,有些地方要 double 有些要 long double ,总之很奇怪,可能是我写的不行。 Code
UVA11605 Lights inside a 3d Grid
灯是独立的,所以可以每个灯 \(k\) 次之后亮着的概率求出来。设操作一次能让这个灯变化的概率为 \(p\) ,\(p\) 的计算就是对于 \(x,y,z\) 轴选择的两个点都在这个灯两侧。\(i\) 次之后亮着的期望可以等比数列求。 Code
HDU4487 Maximum Random Walk
令 \(dp[i][j][k]\) 表示操作了 \(i\) 次,当前在 \(j\) ,最右端为 \(k\) 的概率,转移一下即可。 Code
UVA10601 Cubes
考虑立方体的不同旋转:
- 对面中心为轴旋转。\(90,180,270\)
- 对棱中心为轴旋转。\(180\)
- 对点中心为轴旋转。\(120,240\)
整个 \(6\) 维背包 /fad Code
UVA11774 Doom's Day
\((n+m)/\gcd(n,m)\) . Code
UVA11330 Andy's Shoes
不妨固定左脚的鞋子,那么可以将右脚看做是一个置换,将其分解成 \(x\) 个循环即可,答案就是 \(n-x\) . Code
UVA11540 Sultan's Chandelier
判断树同构要哈希,但是因为子树有先后顺序,所以不能 sort 之后直接做。本题中子树信息是环形,所以只能先把每个孩子开始的序列都做出来,然后再取所有里面最小的作为哈希值。
令 \(dp[u]\) 表示 \(u\) 的子树内本质不同的染色数。根据 Burnside 引理,枚举子树的环的旋转幅度,判断旋转是否合法。对于一个合法的旋转,必然被分成了若干组,每组的每棵子树用同样的染色方案,相乘取均值即可。
UVA12387 Alphabet Soup
也就是要找所有旋转若干度之后重合的方案,重合等价于角度间距相同。然后整个 KMP 匹配一下就好了。计数就是 \(\sum S^{\gcd(P,k)}\) 除以总个数。
这个模数是 \(1e8+7\) /fn . Code
UVA1016 Silly Sort
(翻译有误,代价是交换两数之和)显然要分解置换,然后有两种策略:直接用一个置换里最小的一个一个换,或者是先和序列最小值换再一个一个换,取 \(\min\) 即可。 Code
HDU5080 Colorful Toy
感觉难度全在计算几何上 =.= Code
UVA10655 Contemplation! Algebra
矩阵乘法,随便构造一下就好了。 Code
POJ1322 Chocolate
这个和 FFT 有个啥关系啊……不就一DP么=.=
有意思的是由于精度不高所以 \(n\) 可以减少范围…… Code
UVA10385 Duathlon
Chapter 3

LA4329 Ping pong
POJ3368 Frequent values
因为是保证不降所以可以直接分段然后 RMQ。 Code
UVA1400 "Ray, Pass me the dishes!"
UVA11992 Fast Matrix Operations
每行一棵线段树 /kel Code
UVA11922 Permutation Transformer
UVA11996 Jewel Magic
维护 FHQTreap 上每个节点的哈希值、区间反转之后的哈希值,求 LCP 就暴力二分然后 Hash 判断。 Code
UVA1401 Remember the Word
Trie,类似 \(dp\) 记录一段后缀的方案数。 Code
UVA11732 "strcmp()" Anyone?
比较的实质是,相同部分计算两次,如果完全相同就完成否则再 \(+1\) 。
在插入的过程中记录每个节点经过次数和作为结尾的次数,如果是新建节点就和其他的都比较加上,否则只加当前字符不同的部分。最后要处理完全相同和完全包含。
UVA1462 Fuzzy Google Suggest
首先对给出的字符串集建 Trie 。对于每一次搜索操作,在 Trie 上进行两次 DFS(清理也要,数据范围三百万不可能 memset ,代码中将计算贡献和清除一起写了)
第一次 DFS 对于搜索串进行处理,如果匹配那么直接搜索,否则减少一次剩余修改次数并继续搜索。这个过程中,为了计算贡献需要打 tag ,如果是路径上经过的 Trie 节点就标记为 \(1\) ,如果是结尾就标记为 \(2\) .
第二次 DFS 对 tag 数组清除,并累加第一次出现 \(2\) 的位置的贡献。
UVA1358 Generator
令 \(dp[i]\) 表示匹配了模板串长度为 \(i\) 的前缀所需要的次数期望。
对于一个不是 \(str[i]\) 的字符,设 \(k\) 为 \(i-1\) 跳 \(nxt\) 的结果,那么期望重新生成 \(dp[i-1]-dp[k]\) 次.
UVA1399 Puzzle
AC自动机+DP。首先对于给出的禁止串建自动机,在每个末尾打标记,在得到 \(fail\) 指针的同时注意要传递标记。设 \(dp[u]\) 表示 Trie 树上从节点 \(u\) 往下,不经过标记的最大长度,就是子节点 \(dp\) 值取 \(\max+1\) 。然后一遍 DFS 找是否能出现循环。
UVA719 Glass Beads
最小表示法。 Code
UVA1470 Casting Spells
其实就是找连续出现两次的偶长度回文串。
暴力做法是枚举并判断右边是否也是相同的回文串,考虑 Manacher 的性质。
设现在在位置 \(i\) ,由于 Manacher 把偶数串转化为了奇数,所以要求 \(i\) 是分隔符 # 。当回文半径为 \(4\) 的倍数时,左半边的串长就是偶数,中心为 \(i-r/2\) (其中 \(r\) 是回文半径)。只要左半边中心的回文半径不小于 \(i-r/2\) 那么就是回文串。
UVA11468 Substring
UVA11019 Matrix Matcher
二维 AC自动机板题 /yiw Code
UVA11475 Extend to Palindrome
就是求最长回文后缀。 Code
HDU2586 How far away
Gym102012G Rikka with Intersection of Paths
树上差分/? Code
POJ1741 Tree
点 分 治.jpg Code
UVA12034 Race
画风突变???Code
NC51143 Race
原来是同名题 /tuu ,继续淀粉质qwq (因为牛客不能公开代码所以随便挑了一道 Vjudge 题交了一下)Code
UVA1674 Lightning Energy Report
这为什么要树剖啊……差分不香么 /dk Code
SPOJ Meteors
整体二分。虽然我不需要陨石但是我也想看流星雨/dk Code
UVA12232 Exclusive-OR
UVA11987 Almost Union-Find
大概就整点类似虚点的东西……?防止并查集散架就可以了((

浙公网安备 33010602011771号