日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单位根反演学习笔记

發(fā)布時間:2024/4/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单位根反演学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

emm...原來反演公式有這么多呀。。。

不多說了,直接進入正題。


$$f(x)=\sum_{i=0}^na_ix^i\Rightarrow \sum_{i=0}^na_i[i\ mod \ k=0]=\frac{1}{k}\sum_{i=0}^{k-1}f(w_k^i)$$

我們考慮證明這個式子。

首先,有一個顯而易見的引理。

$$[i \ mod \ k=0]=\frac{1}{k}\sum_{j=0}^{k-1}w_k^{ij}$$

這個式子用等比數(shù)列求和公式搞一下就出來了,就不多講了。

$$\sum_{i=0}^na_i[i \ mod \ k=0]=\frac{1}{k}\sum_{i=0}^n\sum_{j=0}^{k-1}a_iw_k^{ij}=\frac{1}{k}\sum_{j=0}^{k-1}\sum_{i=0}^na_i(w_k^j)^i=\frac{1}{k}\sum_{j=0}^{k-1}f(w_k^j)$$

證畢。


loj6485

題目描述:求$$\sum_{i=0}^nC_n^is^ia_{i\bmod 4} \bmod 998244353$$


首先$$ans=\sum_{j=0}^3a_j\sum_{i=0}^nC_n^is^i[i\bmod 4=j]$$

先考慮$j=0$的時候,構(gòu)造$f(x)=\sum_{i=0}^nC_n^is^ix^i=(sx+1)^n$

所以$$\sum_{i=0}^nC_n^is^i[i\bmod 4=0]=\frac{1}{4}\sum_{j=0}^3f(w_4^j)$$

但是當(dāng)$j>0$的時候怎么辦呢?我們考慮將$f(x)$乘上$x^{-j}$,就可以讓模4余$j$的移到模4余0的位置了。

綜上$$ans=\frac{1}{4}\sum_{j=0}^3f(w_4^j)\sum_{i=0}^3a_iw_4^{-ij}$$

1 #include<cstdio> 2 #define Rint register int 3 using namespace std; 4 typedef long long LL; 5 const int mod = 998244353, inv4 = 748683265; 6 int t; 7 LL n, s, a[4], w[4]; 8 inline LL kasumi(LL a, LL b){ 9 LL res = 1; 10 while(b){ 11 if(b & 1) res = res * a % mod; 12 a = a * a % mod; 13 b >>= 1; 14 } 15 return res; 16 } 17 int main(){ 18 scanf("%d", &t); 19 w[0] = 1; w[1] = kasumi(3, (mod - 1) >> 2); w[2] = w[1] * w[1] % mod; w[3] = w[1] * w[2] % mod; 20 while(t --){ 21 scanf("%lld%lld", &n, &s); n %= mod - 1; 22 for(Rint i = 0;i < 4;i ++) scanf("%lld", a + i); 23 LL ans = 0; 24 for(Rint j = 0;j < 4;j ++){ 25 LL tmp = kasumi((s * w[j] + 1) % mod, n); 26 for(Rint i = 0;i < 4;i ++) 27 ans = (ans + tmp * a[i] % mod * w[(4 - i * j % 4) % 4]) % mod; 28 } 29 printf("%lld\n", ans * inv4 % mod); 30 } 31 }

?


bzoj3328

題目描述:求$$\sum_{i=0}^nC_n^iF_i[i\bmod k=0]$$

其中$F_i$表示斐波那契數(shù)列的第$n$項。


我們構(gòu)造矩陣$$\begin{gather*}A=\begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}\end{gather*}$$

大家對它應(yīng)該很熟悉了,它就是斐波那契數(shù)列的轉(zhuǎn)移矩陣。

顯然$$\begin{gather*}F_i=A^i*\begin{bmatrix}1 \\ 0\end{bmatrix}=A^i_{1,1}\end{gather*}$$

然后構(gòu)造生成函數(shù)$$f(x)=\sum_{i=0}^nC_n^iA^ix^i=(xA+I)^n$$

$$Ans=\sum_{i=0}^nC_n^iA^i[i\bmod k=0]=\frac{1}{k}\sum_{j=0}^{k-1}f(w_k^j)$$

這個矩陣的左上角就是答案。

1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #define Rint register int 5 using namespace std; 6 typedef long long LL; 7 int t, k, p, g; 8 vector<int> fac; 9 LL n; 10 inline int mul(int a, int b){return (LL) a * b - (LL) a * b / p * p;} 11 inline int add(int a, int b){int res = a + b; if(res >= p) res -= p; return res;} 12 struct Matrix { 13 int a[2][2]; 14 inline Matrix(){memset(a, 0, sizeof a);} 15 inline Matrix operator = (const Matrix &o){ 16 memcpy(a, o.a, sizeof a); 17 return *this; 18 } 19 inline Matrix operator * (const Matrix &o) const { 20 Matrix res; 21 for(Rint i = 0;i < 2;i ++) 22 for(Rint k = 0;k < 2;k ++) 23 for(Rint j = 0;j < 2;j ++) 24 res.a[i][j] = add(res.a[i][j], mul(a[i][k], o.a[k][j])); 25 return res; 26 } 27 } A, F; 28 inline Matrix kasumi(Matrix a, LL b){ 29 Matrix res; 30 res.a[0][0] = res.a[1][1] = 1; 31 while(b){ 32 if(b & 1) res = res * a; 33 a = a * a; 34 b >>= 1; 35 } 36 return res; 37 } 38 inline int kasumi(int a, int b){ 39 int res = 1; 40 while(b){ 41 if(b & 1) res = mul(res, a); 42 a = mul(a, a); 43 b >>= 1; 44 } 45 return res; 46 } 47 inline int calc(int x){ 48 A.a[0][0] = x + 1; 49 A.a[1][1] = 1; 50 A.a[1][0] = A.a[0][1] = x; 51 F = kasumi(A, n); 52 return F.a[0][0]; 53 } 54 int main(){ 55 scanf("%d", &t); 56 while(t --){ 57 scanf("%lld%d%d", &n, &k, &p); 58 fac.clear(); 59 int tmp = p - 1; 60 for(Rint i = 2;i * i <= tmp;i ++) 61 if(!(tmp % i)){ 62 fac.push_back(i); 63 while(!(tmp % i)) tmp /= i; 64 } 65 if(tmp > 1) fac.push_back(tmp); 66 for(g = 2;;g ++){ 67 bool flag = true; 68 for(Rint i = 0;i < fac.size() && flag;i ++) 69 if(kasumi(g, (p - 1) / fac[i]) == 1) flag = false; 70 if(flag) break; 71 } 72 g = kasumi(g, (p - 1) / k); 73 int ans = 0; 74 for(Rint i = 0, now = 1;i < k;i ++, now = mul(now, g)) 75 ans = add(ans, calc(now)); 76 ans = mul(ans, kasumi(k, p - 2)); 77 printf("%d\n", ans); 78 } 79 } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/AThousandMoons/p/10502530.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的单位根反演学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。