給定 \(n,s,a_0,a_1,a_2,a_3\), 求:
\[\large \left[ \sum_^n \left( \cdot s^ \cdot a_ \right) \right] \bmod 998244353
\]\(t\le 10^5\) 組測試資料, \(n\le 10^;s,a_i\le 10^9\).
一看 \(n\) 巨大無比顯然不太能直接搞.
但是這個 \(\bmod 4\) 十分的玄妙, 我們嘗試從它入手, 分別計算每個 \(a_i\) 所產生的貢獻.
又因為組合數越界會變 \(0\), 於是答案可以寫成這樣:
\[\sum_^3\sum_ a_ks^i
\]\(i\bmod 4=k\) 等價於 \(4\mid i-k\). 於是我們有:
\[\sum_^3\sum_ a_ks^i
\]把下標換漂亮點並且把求和條件變成布林表示式丟到和式裡:
\[\sum_^3\sum_[4\mid i] a_ks^
\]然後我們如果能找個東西把 \([4\mid i]\) 反演掉就好了.
幸運的是在傅利葉變換中有個東西叫求和引理, 即當 \(k\not \mid n\) 的時候有:
\[\sum_^(\omega_n^k)^j=0
\]不難算出當 \(k\mid n\) 的時候上式的值為 \(n\). 也就是說:
\[\frac 1 n\sum_^(\omega_n^k)^j=\frac 1 n\sum_^\omega_n^=[k\mid n]
\]那麼我們就可以把這個東西代進去按照和式的套路搞一搞求和順序和指標:
\[\begin
&\sum_^3\sum_\left (\frac 1 4\sum_^3\omega_4^\right) a_ks^\\
=&\frac 1 4\sum_^3\sum_^3a_k\sum_s^\omega_4^ \\
\end
\]那麼問題變成了最內層的東西. 我們發現它有點類似二項式定理的形式, 但是 \(\omega_4^r\) 上的指數不太對. 我們強行讓它和二項式係數的部分一樣:
\[\begin
&\frac 1 4\sum_^3\sum_^3a_k\sum_s^\omega_4^\omega_4^ \\
=&\frac 1 4\sum_^3\sum_^3a_k\omega_4^ \sum_s^\omega_4^\\
=&\frac 1 4\sum_^3\sum_^3a_k\omega_4^ \sum_(s\omega_4^r)^ \\
=&\frac 1 4\sum_^3\sum_^3a_k\omega_4^ (s\omega_4^r+1)^n
\end
\]然後就可以算了.
其實 \(\omega_4\) 就是虛數單位 \(i\)...
#include const int i=911660635;
const int ni=86583718;
const int mod=998244353;
const int phi=998244352;
const int inv4=748683265;
typedef long long intex;
int pow(int,int,int);
int main()
ans=1ll*ans*inv4%mod;
printf("%d\n",ans);
} return 0;
}inline int pow(int a,int n,int p)
return ans;
}
loj 6485 LJJ 學二項式定理
給定 n,s,a 0,a 1,a 2,a 3 求 sum s i a 答案對 998244353 取模 1 le n le 10 1 le s,a 0,a 1,a 2,a 3 le 10 8 一臉絕望 在高中的時候,數學老師教會了我們 a b sum a b 然後驚喜的發現這道題不能這麼做!在 oi...
loj6485 LJJ 學二項式定理
題目描述 loj題解 單位根反演。n x frac sum n x i 證明?顯然啊,要麼停在 1,0 要麼轉一圈。所以說題目要求的是 sum c n,i s i a 把 a 提前,變成 sum a k sum c n,i s i 4 i k 然後把上面單位根反演式子套進去。後面變成 sum n c...
loj6485 LJJ 學二項式定理
給出 n,s,a 0,a 1,a 2,a 3 求 sum n binom s i a 對 998244353 取模的值。本來像強行用xiaomange的方法艹過去,but failed。大概猜到和原根有關,但是思考也只是停留在特殊的情況下,沒有進行更有效的思考。正解是單位根反演。大概就是在推式子的過...