P5591 小猪佩奇学数学 题解

题目链接

\[\sum_{i=0}^n \binom n i \times p^{i} \times \left\lfloor \frac{i}{k} \right\rfloor \bmod 998244353 \]

\[1 \leq n,p <998244353,k \in \{2^{w}|0 \leq w \leq 20\} \]

考虑单位根反演:

\[\left [ k \mid n \right ] = \frac{1}{k} \sum_{t=0}^{k-1} \omega_{k}^{tn} \]

将下取整根据意义换成

\[ \left\lfloor \frac{i}{k} \right\rfloor = \left ( \frac{1}{k} \sum_{j=0}^{i} \sum_{t=0}^{k-1} \omega_{k}^{tj} \right ) -1 \]

\(\left [0,n \right ]\)\(k\) 的倍数。
其中从 \(0\) 开始是为了使用二项式定理凑出 \(0\) 项。


带入原式

\[\sum_{i=0}^{n} \binom{n}{i} p^i \left ( \frac{1}{k} \sum_{j=0}^{i} \sum_{t=0}^{k-1} \left ( \omega_{k}^{t} \right ) ^ j -1 \right ) \]

提出 \(-1\),整理式子得到

\[\frac{1}{k} \sum_{i=0}^{n} \binom{n}{i} p^i \left ( \sum_{j=0}^{i} \sum_{t=0}^{k-1} \left ( \omega_{k}^{t} \right ) ^ j \right ) - \sum_{i=0}^{n} \binom{n}{i} p^i \]

二项式定理得到

\[\frac{1}{k} \sum_{i=0}^{n} \binom{n}{i} p^i \left ( \sum_{j=0}^{i} \sum_{t=0}^{k-1} \left ( \omega_{k}^{t} \right ) ^ j \right ) - \left ( p+1 \right ) ^n \]

注意到括号内的东西

\[ \sum_{j=0}^{i} \sum_{t=0}^{k-1} \left ( \omega_{k}^{t} \right ) ^ j \]

\[= \sum_{t=0}^{k-1} \sum_{j=0}^{i} \left ( \omega_{k}^{t} \right ) ^ j \]

特别注意:使用等比公式求和,注意到特殊的 \(\omega_{k}^{0} = 1\) ,特殊计算 \(t=0\)

\[= \sum_{t=1}^{k-1} \frac{\omega_{k}^{t(i+1)}-1}{\omega_{k}^{t}-1} + (i+1) \]

带回原式

\[\frac{1}{k} \sum_{i=0}^{n} \binom{n}{i} p^i \left (\sum_{t=1}^{k-1} \frac{\omega_{k}^{t(i+1)}-1}{\omega_{k}^{t}-1} + (i+1) \right ) - \left ( p+1 \right ) ^n \]

将两部分拆开分别计算

\[\sum_{i=0}^{n} \binom{n}{i} p^i (i+1) \]

\[= \sum_{i=0}^{n} \binom{n}{i} \times p^i \times i + (p+1)^n \]

\[= n \sum_{i=0}^{n} \binom{n-1}{i-1} \times p^i \times i + (p+1)^n \]

\[= np \sum_{i=0}^{n-1} \binom{n}{i} \times p^i \times i + (p+1)^n \]

\[= np(p+1)^{n-1} + (p+1)^n \]

对于另一部分

\[\sum_{i=0}^{n} \binom{n}{i} p^i \sum_{t=1}^{k-1} \frac{\omega_{k}^{t(i+1)}-1}{\omega_{k}^{t}-1} \]

\[= \sum_{t=1}^{k-1} \frac{ \sum_{i=0}^{n} \binom{n}{i} p^i \left( \left( \omega_{k}^{t} \right) ^ {i+1} -1 \right ) } {\omega_{k}^{t}-1} \]

\[= \sum_{t=1}^{k-1} \frac{ \sum_{i=0}^{n} \binom{n}{i} p^i \left( \omega_{k}^{t} \right) ^ {i+1} - (p+1)^n } {\omega_{k}^{t}-1} \]

\[= \sum_{t=1}^{k-1} \frac{ \omega_{k}^{t} \sum_{i=0}^{n} \binom{n}{i} p^i \left( \omega_{k}^{t} \right) ^ i - (p+1)^n } {\omega_{k}^{t}-1} \]

\[= \sum_{t=1}^{k-1} \frac{ \omega_{k}^{t} \left( p \omega_{k}^{t} +1 \right) ^ n - (p+1)^n } {\omega_{k}^{t}-1} \]

则此时可以得到答案式子

\[\frac{1}{k} \left( \sum_{t=1}^{k-1} \frac{ \omega_{k}^{t} \left( p \omega_{k}^{t} +1 \right) ^ n - (p+1)^n } {\omega_{k}^{t}-1} + np(p+1)^{n-1} + (p+1)^n \right) - (p+1)^n \]

计算复杂度 \(O\left(k\log n\right)\)

\(\text{Code}\)

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=998244353;
const int G=3;
int n,p,k,ans;
inline void read(int &x)
{
	int f=1;char c;
	for(x=0,c=getchar();c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); x*=f;
}
inline int mn(int _x,int _y){return _x<_y?_x:_y;}
inline int mx(int _x,int _y){return _x>_y?_x:_y;}
inline int ab(int _x){return _x<0?-_x:_x;}
inline int qpow(int base,int cnt){
	int rest=1;base%=mod;
	while(cnt){
		if(cnt&1) rest=1ll*rest*base%mod;
		base=1ll*base*base%mod;
		cnt>>=1;
	}
	return rest;
}
inline int S1(){
	int rest=0,tmp;
	for(int t=1;t<k;t++){
		int w=qpow(qpow(G,(mod-1)/k),t);
		tmp=(1ll*w*qpow((1ll*p*w%mod+1)%mod,n)%mod-qpow(p+1,n)+mod)%mod;
		tmp=1ll*tmp*qpow((w-1+mod)%mod,mod-2)%mod;
		rest=(rest+tmp)%mod;
	}
	return rest;
}
inline int S2(){
	return (1ll*n*p%mod*qpow(p+1,n-1)%mod+qpow(p+1,n))%mod;
} 
int main()
{
	read(n);read(p);read(k);
	ans=(1ll*(S1()+S2())%mod*qpow(k,mod-2)%mod-qpow(p+1,n)+mod)%mod;
	printf("%d\n",ans);
	return 0;
}


总结:

本题运用了单位根反演来避免下取整运算,同时 \(k\)\(2\) 的若干次方也为求模意义下的单位根提供便利。
在使用等比公式求和时,也应该注意公比为\(1\)的特殊情况、

posted @ 2023-07-07 19:51  ReineRabbit  阅读(51)  评论(0)    收藏  举报