技巧
快速幂
思路
数学性质 如 7^10 = 7^5 * 7^5
7^5 = 7^2 * 7^2 * 7^1
这里要注意 两个大数字直接相乘然后取模可能会爆掉 需要把乘法转换成加法一次一次的运算取模
相乘的话 例如 3 * 5 (011 * 101) 代表3个5 相加。 101可以看成 1个3 和4个3相加 循环时候a保持倍增即可
实现
package main import ( "bufio" . "fmt" "io" "os" ) // 乘法转加法每次都mod 防止a*b爆掉 func mul(a, b ,mod int) int{ ans := 0 for b != 0 { if b & 1 == 1 { ans = (ans + a) % mod } a = (a + a) % mod b >>= 1 } return ans } // 快速幂模板 - 循环 func qpow(A, B, P int) int{ ans := 1 for B != 0 { if (B & 1) != 0 { ans = mul(ans, A, P) } A = mul(A, A, P) B >>=1 } return ans } // 快速幂模板 - 递归 func qpow1(A, B, P int) int{ if B == 0 { return 1 } if B % 2 == 1 { return mul(qpow1(A, B-1, P), A, P) }else { tmp := qpow1(A, B/2,P) return mul(tmp, tmp, P) } } // https://ac.nowcoder.com/acm/problem/23046 func NC23046(_r io.Reader, _w io.Writer) { in, out := bufio.NewReader(_r), bufio.NewWriter(_w) defer out.Flush() var T int for Fscan(in, &T); T > 0; T-- { var A, B, P int Fscan(in, &A, &B, &P) Fprintln(out, qpow1(A,B,P)) } } func main() { NC23046(os.Stdin, os.Stdout) }