Nugine 的个人博客关于

HDU-4704 Sum

题目: Sum

M=109+7M = 10^9 + 7

易得 ans=2N1modMans = 2 ^ {N-1} \mod M

NN 非常大,因此要想办法化简。

解法1: 费马小定理 + 快速幂

注意到 MM 是素数,因此可用费马小定理。

ap1modp=1a ^ {p - 1} \mod p = 1

在本题中,即

2M1modM=12 ^ {M - 1} \mod M = 1

N1=(M1)t+kN - 1 = (M - 1)\cdot t + k, 则

2N1modM=  ((2M1)t×2k)modM=  2kmodM\begin{aligned} &2 ^ {N-1} \mod M\\ =\; &((2^{M-1}) ^ t \times 2 ^ k) \mod M\\ =\; &2 ^ k \mod M \end{aligned}

此时 k=(N1)mod(M1)k = (N - 1) \mod (M - 1), 但要注意保证 kk 为非负数。

剩下的就是使用快速幂取模计算答案了。

解法2:高精度求幂 + 除法取模

既然要计算 2N1modM2 ^ {N - 1} \mod M, 有没有办法直接计算呢?

本质上是单精度的高精度次幂的取模运算,那么就能分解。

123=((0×10+1)×10+2)×10+3\boldsymbol{123} = ((\boldsymbol{0} \times10 +\boldsymbol{1})\times10 +\boldsymbol{2})\times10 +\boldsymbol{3}

2123=((110×21)10×22)10×23\boldsymbol{2 ^ {123}} = ((\boldsymbol{1}^{10} \times \boldsymbol{2^1})^{10} \times \boldsymbol{2 ^ 2})^{10} \times \boldsymbol{2 ^ 3}

边读边乘,读完 NN 就得到了 2NmodM2 ^ N \mod M.

除法取模又用到了费马小定理:

acmodp=  (acmodp)(cp1modp)=  acp2modp\begin{aligned} &\frac{a}{c} \mod p\\ =\; &(\frac{a}{c} \mod p)\cdot (c^{p-1}\mod p)\\ =\; &a\cdot c^{p-2} \mod p \end{aligned}

适用条件: c,pc, p 互质。

在本题中,有

2N1modM=  (2N×2M2)modM=  ((2NmodM)×C)modM\begin{aligned} &2 ^ {N - 1} \mod M\\ =\; &(2 ^ N \times 2 ^ {M - 2}) \mod M\\ =\; &((2 ^ N \mod M) \times C) \mod M \end{aligned}C=(2M2modM)C=(2 ^ {M - 2} \mod M)

CC 是常量,先写个快速幂就能求出来。

最后相乘取模,得解。

代码

解法1:sum.1.cpp

解法2:sum.2.cpp

发布于 2019-02-01地址: GitHub