Dyt′s math
求解下式,对 998244353 取模:
i=1∑nCikbi
k≤5×105,n≤1018,2≤b≤998244353.
正解部分
设 Fk=i=1∑nCikbi, 则 Fk−1=i=1∑nCik−1bi,
bFk−1=i=2∑n+1Ci−1k−1bi,
bFk=i=2∑n+1Ci−1kbi,
∴bFk−1+bFk=i=2∑n+1(Ci−1k+Ci−1k−1)bi=i=2∑n+1Cikbi=Fk+Cn+1kbn+1−C1kb .
∴Fk=1−bbFk−1−Cn+1kbn+1+C1kb
又∵F0=∑i=1nbi=1−bb(1−bn)
所以可以 O(K) 得到 Fk .
实现部分
#include<bits/stdc++.h>
#define reg register
typedef long long ll;
const int maxn = 500005;
const int mod = 998244353;
int K;
int B;
ll N;
int Ksm(int a, ll b){int s=1;while(b){if(b&1)s=1ll*s*a%mod;a=1ll*a*a%mod;b>>=1;}return s;}
int main(){
scanf("%lld%d%d", &N, &B, &K);
int inv_b = Ksm(B-1, mod-2);
int Ans = 1ll*B*(Ksm(B, N)-1)%mod*inv_b % mod;
int C = (N + 1)%mod;
for(reg int i = 1; i <= K; i ++){
int C1kb = (i==1)*B;
Ans = -1ll*B*Ans % mod;
Ans += 1ll*C*Ksm(B, N+1)%mod;
Ans -= C1kb;
Ans %= mod, Ans += mod, Ans %= mod;
Ans = 1ll*Ans*inv_b % mod;
C = (N-i+1)%mod*C%mod*Ksm(i+1, mod-2)%mod;
}
printf("%d\n", Ans);
return 0;
}