主体思路
快速幂+费马小定理
注意细节
在go中, 可以不用特意用int64
基础代码
package main
import (
"fmt"
"bufio"
"os"
)
const (
N = 100010
mod = 1e9 + 7
)
var (
out = bufio.NewWriter(os.Stdout)
in = bufio.NewReader(os.Stdin)
n int
fact, infact [N]int
)
func qmi(a, k, p int) int {
res := 1
for k > 0 {
if k & 1 > 0 { res = res * a % p }
a = a * a % p
k >>= 1
}
return res
}
func main() {
fact[0], infact[0] = 1, 1
for i := 1; i < N; i++ {
fact[i] = fact[i - 1] * i % mod
infact[i] = infact[i - 1] * qmi(i, mod - 2, mod) % mod
}
fmt.Fscan(in, &n)
for; n > 0; n-- {
a, b := 0, 0
fmt.Fscan(in, &a, &b)
fmt.Fprint(out, fact[a] * infact[b] % mod * infact[a - b] % mod, "\n")
}
out.Flush()
}
昨晚刚看了,谢谢题解
您好,我想请教一下,无论是Wikipedia还是 OIwiki,上面写的都是
a^{p-1} \equiv 1 \pmod{p}
为什么这里写的是
p - 2
呢?这里还是在求逆元。
你参考参考这里:acw_weian大大写的题解 https://www.acwing.com/solution/content/16482/
谢谢同学推荐了题解,我也回去翻了之前写的笔记,和当时Y老师讲得一模一样。简而言之,这里 p - 2是为了改写为乘法的形式,其数学意义与费马小定理是等价的。至于为什么改写为乘法形式,一时间没想出来。不过可以看到,乘法形式与预处理阶乘中,乘以快速幂就刚好可以对应起来。