作为入门,本人选择了模拟与高精度作为学习之始,做完了这一板块的洛谷官方题单。
模拟题不涉及算法,考验的是代码能力,自不必多说,所以仅总结一些在做题时学到的tricks。
高精度
- 为了方便进位,将字符串转为数字的时候倒序存储
- 两个数相加,最高位数只可能是两个数位数最大的加一
- 最后别忘了将lans更新到正确的位置上(最高非零位)
-
计算阶乘之和的简便运算
-
别忘了把计算乘法的数组的初始值设为1!
-
在运算中维护数组的长度,避免全部遍历
快速幂
递归
非递归
- 快速幂的两种模板
- b&1的含义是取出b在二进制下的最后一位
- 具体解释可以参考此文章
输入p,输出2p−1的位数和后五百位
- 数字很大,用纯高精TLE,此处用快速幂的非递归版本
- 此处仅要求输出结果的后500位,由于取模运算的分配律,在计算过程中只要计算每个中间结果的后500位即可
- tmp为保存中间结果的数组,别忘了每次运算前将其清零
- 别忘了每次运算结束后把tmp赋值给结果数组
- 可以证明,2p−1的位数和2p相同,而2p的位数可直接由公式log10(2)∗p+1算出来,故位数可以直接输出
模拟
快读
由于使用scanf()需要自己处理空格问题,而cin速度太慢,所以使用快读函数读入整数
数组旋转
魔法少女小Scarlet
结构体排序
帮贡排序
构造特征值
两只塔姆沃斯牛 The Tamworth Two
此题唯一的难点就在于如何判断John和牛永远不会相遇。虽说可以记录循环次数,如果超过一定数量(比如10000)就认为永远不会相遇,但毕竟过于牵强。可以用构造特征值的方法:
-
首先,如果在某一时刻,John和牛所处的位置和他们的朝向都与之前某一时刻相同,也就是说他们二者进入了死循环,我们可以认为他们永远不会相遇。
-
基于此,我们可以用这六个变量构造出一个特征值nt,如果出现了重复的nt值,则停止循环。
-
特征值的构造要满足的条件是:不同情况的特征值不能相同。可以通过给每个变量乘上一个不同的权重实现。
一共有10∗10∗10∗10∗4∗4=160000种情况。构造函数:
此函数的最大值为9+90+900+9000+30000+120000=159999,且保证一个变量加一所引起的函数值变化不会和其他变量加一相同,保证唯一性。
一道不错的模拟题
作业调度方案