51 nod 1013 3的冪的和

2021-08-15 14:53:55 字數 1249 閱讀 7093

1013 3的冪的和

基準時間限制:1 秒 空間限制:131072 kb 分值: 20 

難度:3級演算法題

求:3^0 + 3^1 +...+ 3^(n) mod 1000000007

input

輸入乙個數n(0 <= n <= 10^9)
output

輸出:計算結果
input示例

3
output示例

40思路為快速冪加逆元,至於為什麼要求逆元:

首先說明乙個事實,你直接算出來乙個數的結果直接對p取模,結果一定是對的。

但如果我們要通過乙個前面取過模的式子遞推出其他要取模的式子,而遞推式裡又存在除法

那麼乙個很尷尬的事情出現了,假如a[i-1]=100%31=7 a[i]=(a[i-1]/2)%31

a[i]=50%31=19 ,但我們現在只知道a[i-1]=7,如何利用a[i-1]未取模之前的值100計算出a[i]=19呢?顯然用a[i]=(7/2)%31=3是不對的。

逆元的求法:

若對於數字a,c 存在x,使a * x = 1 (mod c) ,那麼稱x為 a 對c的乘法逆元。

逆元的作用?

12 / 4 mod 7 = ? , 很顯然結果是3

我們現在對於數對 (4,7), 可以知道 x = 2是 4 對7的乘法逆元即2*4=1(mod 7)

那麼我們有(12 / 4) * (4 * 2 ) = (?) * (1) (mod 7)

除法被完美地轉化為了乘法

理論依據:

f / a mod c = ?

如果存在 a*x = 1 (mod c)

那麼2邊同時乘起來,得到 f * x = ? (mod c)

成立條件

(1) 模方程 a * x = 1(mod c) 存在解

(2) a | f (f % a == 0)

在這道題裡邊,計算前n項和的函式計算出的結果是對目標值取模後的值(不取模的話long long也儲存不下來),所以用取模後的值去除以2就出現錯誤了(因為我們要的是未取模之前的值除以2的結果),這時我們利用逆元法把除法轉化為乘法就不會出錯了。

#include const int  mod=1000000007;

using namespace std;

long long fun(int m,int n)

return sum;

}int main()

51nod 1013 3的冪的和

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果input示例 3output示例 40思路 根據等比數列和的公式,本題的解為 3 n 1 1 2 1000000007。如果x與y的積除以z所得的餘數為1,即xy 1 ...

51NOD 1013 3的冪的和

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果input示例 3output示例 40 很簡單,這個題目是乙個前n項求和的題 首先寫出求和公式發現分母上有個2劃開後可以變成3 n 2 1 2鑑於他是乙個整型數而3 n...

51 Nod 1013 3的冪的和

1013 3的冪的和 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果input示例 3output示例 40題意 思路 明顯的等比數...