演算法競賽入門經典第十章學習筆記 大整數取模 冪取模

2021-10-03 06:41:46 字數 1708 閱讀 1652

10-1 大整數取模

題目:輸入整整數n和m,輸出n mod m的值。n≤1

0100,m

≤109

n\leq 10^,m\leq 10^9

n≤1010

0,m≤

109。

這道題的特別之處在於n的範圍很大,無法用整型變數儲存和直接計算。大整數n用兩個字串儲存,m可以用整型儲存。我們可以將n的每位數字分離,變成如下形式:abc

de=(

(((a

×10+b

)×10+

c)×10

+d)×

10+e)

abcde=((((a×10+b)×10+c)×10+d)×10+e)

abcde=

((((

a×10

+b)×

10+c

)×10

+d)×

10+e

),每步取模。

#include

#include

#include

using

namespace std;

long

long

intbig_num_mod

(string a,

long

long

int b)

intmain()

10-2 冪取模

輸入正整數a, n和m, 輸出a

na^n

anm od

modmodmm

m的值。

如果直接計算pow(a,n)%m,pow(a,n)可能溢位。可以迴圈n次每次取模:

int ans=a%m;

for(

int i=

1;i) ans=ans*a%m;

return ans;

不太可能溢位,但是時間為o(n),當n比較大時,需要乙個更快的演算法。我們注意到an=

(a2)

n/

2a^n=(a^2)^

an=(a2

)n/2

,只需要將n擴大一倍,n次乘法會變成n/2次乘法。繼續二分下去有可能使o(n)的時間變為o(logn)的時間。但是需要注意當n為奇數時,an=

(a2)

n/2×

aa^n=(a^2)^×a

an=(a2

)n/2

×a,因為n/2向下取整會少作一次乘法。遞迴演算法:

#include

using

namespace std;

long

long

intpower_mod

(int a,

int n,

int m)

intmain()

非遞迴演算法(while迴圈):

#include

using

namespace std;

long

long

intpower_mod

(int a,

int n,

int m)

return ans;

}int

main()

第十章 函式

使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...

第十章 屬性

z屬性 本章也比較簡單稍作介紹 無參屬性就是我們常見的屬性 可以封裝屬性 以執行緒安全方式訪問 有參屬性就是c 中的所引器 匿名型別 如圖遇到如下 具體點就是 上面的注釋也已經講清楚了,定義的型別之後,構造例項,然後初始化屬性。現在詳細說下 編譯器接收到 上圖 先用var 定義乙個型別,但是不具體指...

第十章 屬性

目錄 10.1 無參屬性 10.2 有參屬性 10.3 呼叫屬性訪問器方法時的效能 10.4 屬性訪問器的可訪問性 10.5 泛型屬性訪問器方法 物件導向設計和程式設計的重要原則之一就是資料封裝,意味著型別的字段不應該公開,否則很容易因為不恰單使用欄位而破壞物件的狀態。可將屬性想象成智慧型字段,即背...