生活随笔
收集整理的這篇文章主要介紹了
Loj#6485. LJJ 学二项式定理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Loj#6485. LJJ 學二項式定理(單位根反演)
題目描述
題目描述
題意:求下面式子的答案QAQ。
[∑((ni)?si?aimod4)]mod998244353[\sum(\tbinom{n}{i}\cdot s^i \cdot a_{i\;\;mod\;\;4}) ]\;mod\;\;998244353 [∑((in?)?si?aimod4?)]mod998244353
Solution
The first 單位根反演題 of me。
題目中的式子很有趣,它的形式為∑aimod4\sum a_{i \;\;mod \;\;4}∑aimod4?
這就是一個典型的單位根反演的形式,因此考慮單位根反演的公式
1n∑i=0n?1ωik=[n∣k]\frac{1}{n}\sum_{i=0}^{n-1} \omega^{ik}=[n|k] n1?i=0∑n?1?ωik=[n∣k]
我們枚舉k=i%4k=i\%4k=i%4,原式變為:
∑k=03ak∑i=0n[4∣i+4?k]si?(ni)\sum_{k=0}^3 a_k \sum_{i=0}^n [4|i+4-k]s^i \cdot \tbinom{n}{i} k=0∑3?ak?i=0∑n?[4∣i+4?k]si?(in?)
單位根反演,替換[4∣i+4?k][4|i+4-k][4∣i+4?k]進一步化簡得到
∑k=03ak∑i=0n∑j=03ω4j(i+4?k)si?(ni)\sum_{k=0}^3 a_k \sum_{i=0}^n \sum_{j=0}^3 \omega_4^{j(i+4-k)}s^i \cdot \tbinom{n}{i} k=0∑3?ak?i=0∑n?j=0∑3?ω4j(i+4?k)?si?(in?)
整理式子:
∑k=03ak∑j=03ω4j(4?k)(∑i=0nω4ijsi?(ni))\sum_{k=0}^3 a_k \sum_{j=0}^3 \omega_4^{j(4-k)} (\sum_{i=0}^n\omega_4^{ij}s^i \cdot \tbinom{n}{i}) k=0∑3?ak?j=0∑3?ω4j(4?k)?(i=0∑n?ω4ij?si?(in?))
二項式定理一波走:
∑k=03ak∑j=03ω4j(4?k)(sωj+1)n\sum_{k=0}^3 a_k \sum_{j=0}^3 \omega_4^{j(4-k)}(s\omega^j+1)^n k=0∑3?ak?j=0∑3?ω4j(4?k)?(sωj+1)n
所以我們只需要預處理之后計算即可。
單次復雜度O(c+lgn)O(c+lgn)O(c+lgn),ccc為常數。
注意longlonglong\;\;longlonglong,下面的代碼defineintlldefine\;\;int\;\;lldefineintll了。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se second
#define int llusing namespace std
;template<typename T
>inline bool upmin(T
&x
,T y
) { return y
<x
?x
=y
,1:0; }
template<typename T
>inline bool upmax(T
&x
,T y
) { return x
<y
?x
=y
,1:0; }typedef long long ll
;
typedef unsigned long long ull
;
typedef long double lod
;
typedef pair
<int,int> PR
;
typedef vector
<int> VI
;const lod eps
=1e-11;
const lod pi
=acos(-1);
const int oo
=1<<30;
const ll loo
=1ll<<62;
const int mods
=998244353;
const int MAXN
=600005;
const int INF
=0x3f3f3f3f;
inline int read()
{int f
=1,x
=0; char c
=getchar();while (c
<'0'||c
>'9') { if (c
=='-') f
=-1; c
=getchar(); }while (c
>='0'&&c
<='9') { x
=(x
<<3)+(x
<<1)+(c
^48); c
=getchar(); }return x
*f
;
}
inline int quick_pow(int x
,int y
)
{if (y
==0) return 1;int q
=quick_pow(x
,y
>>1);return (y
&1)?1ll*q
*q
%mods
*x
%mods
:1ll*q
*q
%mods
;
}
int a
[4],w
[4],P
[4];
signed main() {int Case
=read();int wn
=quick_pow(3,(mods
-1)/4);int inv4
=quick_pow(4,mods
-2);w
[0]=1; for (int i
=1;i
<4;i
++) w
[i
]=1ll*w
[i
-1]*wn
%mods
;while (Case
--) {ll n
=read(),s
=read(),ans
=0;for (int i
=0;i
<4;i
++) a
[i
]=read();for (int i
=0;i
<4;i
++) P
[i
]=quick_pow((1ll*w
[i
]*s
+1)%mods
,n
);for (int i
=0;i
<4;i
++) {int p
=1ll*a
[i
]*inv4
%mods
;for (int j
=0;j
<4;j
++) ans
=(ans
+1ll*p
*w
[j
*(4-i
)%4]%mods
*P
[j
]%mods
)%mods
;}printf("%d\n",ans
);}return 0;
}
總結
以上是生活随笔為你收集整理的Loj#6485. LJJ 学二项式定理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。