零、取模
在计算结果很大时,如果要展示完整的答案需要手写高精度(即大整数储存和运算),比较复杂而且淡化了题目考查的知识。所以常常只比较程序的得数与标准答案在某个质数下的模是否相等来判断结果是否正确。因此计算过程中需要常常取模防止溢出。
以下程序中默认mod为模数,如998244353或1000000007。
一、什么是幂:
普通算法计算 a n a^n an时一般为循环n次,每次乘以a。比如
ans=1;
for(i=0;i<n;i++)
{
ans=ans*a%mod;
}
时间复杂度时O(n)
二、快速幂
当题目要求计算 x 1 0 10 x^{10^{10}} x1010时,需要 1 0 10 10^{10} 1010次运算,普通电脑需要很久才能有结果。而快速幂可以在O(log n)的时间复杂度内算出结果。
n的二进制表示为 ( a m . . . a 2 a 1 a 0 ) 2 (a_m...a_2a_1a_0)_2 (am...a2a1a0)2,即
n = a m ∗ 2 m + . . . + a 1 ∗ 2 1 + a 0 ∗ 2 0 n=a_m*2^{m}+...+a_1*2^{1}+a_0*2^0 n=am∗2m+...+a1∗21+a0∗2