int
qupow
(int a,
int b,
int m)
return ans;
}
位運算**為
int
qupow
(int a,
int b,
int m)
return ans;
}
快速冪將原來0(b)的時間複雜度降為了o(logb)
首先我們在一般方式求素數時,可以採用以下方式
bool
ifprime
(int x)
return
true
;}
為何用ii<=x; 因假如乙個數x=nm,那麼n和m必定有乙個小於x/2;所以在x/2前不存在能整除x的整數,那麼x就一定是素數。
在做題中如果需要判斷大量的數,如還用上述方法將使效率大大降低,這種情況下可以選擇使用素數篩,素數篩也就是在查詢數之前將所有的數都判斷好是否為素數,存於陣列,等輸入要判斷的數時就可直接通過陣列記錄來判斷出是否為素數。
時間複雜度為 o(nloglogn)
bool v[maxn+5]
;memset
(v,true
,sizeof
(v))
;for
(int i=
2;i<=n;i++
)}
普通素數篩有很多陣列都被重複遍歷,所以可以採用線性篩,也稱尤拉篩。
尤拉篩的時間複雜度為o (n)
bool v[maxn+5]
;int prime[maxn+5]
;void
isprime()
}}
數論2 素數篩
判斷素數可通過試除小於 sqrt n 的素數來實現,那麼將其反過來,只要將 sqrt n 的素數的倍數都刪掉,那麼就能得到一張 n 的素數表,o n lg lg n 需劃掉合數,所以最初假設均為素數,即陣列初始化為0 bool composite maxn void generate int n f...
數論 快速冪
快速冪 演算法介紹演算法利用了二分的思想,可以達到o logn 可以把b按二進位制展開為 b p n 2 n p n 1 2 n 1 p 1 2 p 0 其中p i 0 i n 為 0 或 1 這樣 a b a p n 2 n p n 1 2 n 1 p 1 2 p 0 a p n 2 n a p ...
數論 快速冪
沒看懂,先記著 轉 typedef long long ll ll mod ll qpow ll a,ll n 計算a n mod return re mod struct matrix 定義乙個結構體,方便傳遞值 maxn和mod由全域性定義,其中mod根據需要可以省去 matrix mat mu...