打表启示录
分段打表
对于某些依赖项仅与n有关或仅与前几项有关时的打表方法。
- 一个典型的例子是求1e9内n阶乘取模的运算。
可以提前处理出1e7,2e7...的值,如果需要某个值时先取出低于它的最大的已知数从当前位置开始计算。间隔可以不是1e7,根据需要(权衡时间与程序大小限制)也可以更改为其他的 - 另一个例子是求斐波那契数列取模的运算。
比如求1e9内的斐波那契取模运算,可以求1e7,1e7+1,2e7,2e7+1...由此来在O(1e7)的时间内求出1e9内任意斐波那契数。
打表找规律
某些题目中的输出与输入有着较为简单的数学关系,时间复杂度估算O(1)(多项式)或者O(logn)(快速幂)或者O(n)(递推式)的均可考虑打表找规律。
对于这一类题目输入数据一般每个测试点只有一或少数几个数,存在ans=f(x)或ans=kf(x)等其他关系,并且由题目的意思答案通常要在输入数据经过一系列复杂的计算得到。
对于该类题目通常有以下几种找规律方法:
- 通过暴力列出前若干项答案
- 判断数据的增长级别(确认大致是多项式级还是指数级等)
- 尝试猜测公式,并列出更多数据加以验证。
- 难以猜测的尝试前后项作差或者考虑前缀和等
- 除上一点还可尝试分类(如奇偶单独处理,质数合数单独处理,2^k单独处理等等)