位运算
快速幂问题 求 \(a\) 的 \(b\) 次方对 \(p\) 取模的值, \(1<=a,b,p<=10^9\) 典型快速幂解法, b&1为真,表示为奇数,b>>=1右移1位,表示除2 long long solve(long long a, long long b, long long p){ long long ans = 1; while(b){ if(b & 1) ans = ans * a % p; a = a * a % p; b >>= 1; } return ans; } 从二进制的角度看,实际是 将b表示为二进制的按权展示式 \(b=c_{k-1}2^{k-1}+c_{k-2}2^{k-2}+...+c_02^0\) , \(a^b=a^{c_{k-1}2^{k-1}}*a^{c_{k-2}2^{k-2}}*...*a^{c_02^0}\) 同时注意到!! b&1可以取出b的二进制表示的最低位,b>>=1可以去除最低位 , 于是可以从0号位遍历每个数位进行累积运算!! long long solve(long long a, long long b, long long p){ long long ans = 1; for(;b;b>>=1){ if(b & 1) ans = ans * a % p; //为1时才累计进ans a = a * a % p; /