題目鏈結
\(description\)
給定\(x,t\),\(t\)次詢問,每次給定\(k\)求\(x^k\% 998244352\)。
\(x,k\lt 998244352,\ t\leq 5\times10^6\)。
\(solution\)
做法1:
直接快速冪就行了。沒過的是\(5e6\)還沒用快讀的(所以時限應該改0.5s)。
做法2:
常規以\(2\)為底的快速冪:\(x^n=x^\rfloor\times2}\times x^\)。
同理可以改成以\(3\)為底:\(x^n=x^\rfloor\times3}\times x^\)。(但是不能位運算優化,不如常規寫法)
int fp(ll x,int k)
同理可以改成以任意數\(k\)為底:\(x^n=x^\rfloor\times k}\times x^\)。
取\(k=\sqrt\),則只需預處理\(x^0,x^k,x^,...,x^\rfloor\times k}\),以及\(x^0,x^1,...,x^\),複雜度\(o(k)\)。
詢問就是\(o(1)\)的了。
細節:最好取\(k=\sqrt+1\)?應該問題不大但是基本都加了\(1\)。。
//308ms 1.0mb
#include #define pc putchar
#define maxin 300000
#define gc() getchar()
//#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)
#define pb emplace_back
#define mod 998244352
typedef long long ll;
const int n=1e5+5,k=(int)(sqrt(mod))+1;
int a[n],b[n];
char in[maxin],*ss=in,*tt=in;
inline int read()
int fp(ll x,int k)
int main()
快速冪 普通快速冪 矩陣快速冪
題意 n個人排隊,f表示女,m表示男,包含子串 fmf 和 fff 的序列為o佇列,否則為e佇列,有多少個序列為e佇列。分析 矩陣快速冪入門題。下面引用巨巨解釋 用f n 表示n個人滿足條件的結果,那麼如果最後乙個人是m的話,那麼前n 1個滿足條件即可,就是f n 1 如果最後乙個是f那麼這個還無法...
快速冪(整數快速冪 矩陣快速冪)
1 整數快速冪 例如求x 8 就是x x x x x x x x 正常的運算方式是,x的值乙個個往上乘上去,乘法運算執行7次 x x x x x x x x 也可以採用這種運算方式,先進行乘法得到x 2再對x 2進行三次乘法。這種運算要明顯比第一種情況要快 所以對於整數快速冪,也是結合了這種思想 x...
快速冪(矩陣快速冪)
求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...