原理
[a^n=egin{matrix} underbrace{ a*a*…*a } \ n end{matrix}\
a^{13}=a^{(1101)_2}=a^8*a^4*a^1
]
应用
矩阵快速幂和多次置换
计算斐波那契数列可以构建(2*2)的转移矩阵从(F_i,F_{i+1})到(F_{i+1},F_{i+2})的变换,将转移矩阵用快速幂优化到(n^3logk)
把序列置换(k)次,将置换快速幂自乘(k)次
加速线性变换
三维空间中
[egin{bmatrix}1 & 0 & 0 & a \0 & 1 & 0 & b \0 & 0 & 1 & c \0 & 0 & 0 & 1end{bmatrix}*egin{bmatrix}x\y\z\1end{bmatrix}=*egin{bmatrix}x'\y'\z'\1end{bmatrix}
]
将(x)加(a),(y)加(b),(z)加(c)
[egin{bmatrix}
a & 0 & 0 & 0 \
0 & b & 0 & 0 \
0 & 0 & d & 0 \
0 & 0 & 0 & 1end{bmatrix}
]
(x)放大(a)倍,(y)放大(b)倍,(z)放大(c)倍
[egin{bmatrix}
1 & 0 & 0 & 0 \
0 & cos heta & sin heta & 0 \
0 & -sin heta & cos heta & 0 \
0 & 0 & 0 & 1end{bmatrix}
]
绕(x)轴旋转( heta)度
模意义下大整数乘法
龟速乘:将乘法拆分成二进制加放放置爆long long
快速乘:
[a*b mod m=a*b-lfloorfrac{ab}{m}
floor*m
]
利用(unsigned long long)的自然溢出,减法前后两部分都自然溢出,差值不变
[a*b mod m=a*b-lfloorfrac{ab}{m}
floor*m=(a*b-lfloorfrac{ab}{m}
floor*m) mod 2^{64}
]
对于(lfloorfrac{ab}{m} floor)可以用(long double)算
因为浮点数误差,运算结果应该返回((ret+m) mod m)
快速乘的一点转化:
当模数小于(10^{12})时
[x*y mod P\
A=(x*(y>>25))\% P*(1<<25)\%P\
B=(x*(y&((1<<25)-1))\%P\
x*y mod P=(A+B) mod P
]
利用分配律可以完全做到(O(1))
光速幂
要求同一底数,同一模数,(O(sqrt{n}))预处理,(O(1))查询
选定一个数(s),预处理出(a^0)到(a^s)和(a^{0*s})到(a^{lceilfrac{p}{s} ceil})
每次询问(a^b mod p),将(b)拆分为(lfloorfrac{b}{s} floor*s+b mod s),则(a^b=a^{lfloorfrac{b}{s} floor*s}*a^{b mod s})
(s)选择(sqrt{p})可以做到根号平衡,选择合适大小的(2)的次幂可以位运算优化