loj #6247. 九个太阳
求
$\sum\limits_{i=1}^n [k | i] \times C_n^i$
膜 $998244353$
$n \leq 10^{15},k \leq 2^{20}$
$k$ 是 $2$ 的正整數(shù)次方
?
sol:
“不看題解拿頭做” 系列
考慮構(gòu)造一個(gè)序列 $a_i$ 滿足只有 $[k|i]$ 時(shí)是 $1$,其它時(shí)候是 $0$
之后就開始神仙了起來
?
構(gòu)造 $k$ 次單位根 $\omega _k = g^{\frac{p-1}{k}}$,發(fā)現(xiàn) $\frac{1}{k} \times \sum\limits_{j=0}^k \omega _k^{i \times j} = [k | i]$
代入原式得到 $\sum\limits_{i=1}^n?\frac{1}{k} \times \sum\limits_{j=0}^k \omega _k^{i \times j} \times C_n^i$
根據(jù)二項(xiàng)式定理 $\sum\limits_{i=1}^n C_n^i \times x^i = (x+1)^n$,可以化簡
$\frac{1}{k} \times \sum\limits_{j=0}^k (\omega_k ^j + 1)^n$
這就可以直接求了
#include <bits/stdc++.h> #define LL long long using namespace std; #define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i) #define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i) inline LL read() {LL x = 0, f = 1; char ch = getchar();for (; !isdigit(ch); ch = getchar())if (ch == '-')f = -f;for (; isdigit(ch); ch = getchar()) x = 10 * x + ch - '0';return x * f; } const int mod = 998244353; inline int ksm(int x, int t) {int res = 1;for(; t; x = 1LL * x * x % mod, t = t >> 1) if(t & 1) res = 1LL * x * res % mod;return res; } int main() {LL n = read() % (mod-1), k = read();int ans = 0;int wn = ksm(3, (mod-1) / k), w = ksm(3, (mod-1) / k);rep(i, 0, k-1) {(ans += ksm(w + 1, n)) %= mod;w = 1LL * w * wn % mod;}ans = 1LL * ans * ksm(k, mod - 2) % mod;cout << ans << endl; } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/Kong-Ruo/p/10491026.html
總結(jié)
以上是生活随笔為你收集整理的loj #6247. 九个太阳的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刚从阿里、头条面试回来,java字符串截
- 下一篇: 用户体验要素:以用户为中心的产品设计