P5591 小猪佩奇学数学
知识点
二项式定理
(x+1)n=n∑i=0(ni)xi
单位根反演
[n∣k]=1nn−1∑i=0ωikn
证明:
[n∣k]=⎧⎨⎩1n∑n−1i=0ωikn=1n∑n−1i=01=1,n∣k1n∑n−1i=0ωikn=1nωkn−ωnkn1−ωkn=0,n∤k
题意
求
n∑i=0(ni)pi⌊ik⌋(mod998244353)
1≤n,p≤998244353,k∈{2w|0≤w≤20}
思路
一看到前面这个形式容易想到二项式定理,但是后面这个 ⌊ik⌋ 不好处理。
观察一下数据范围发现 k 较小,考虑使用单位根反演,我们将柿子往这边化:
⌊ik⌋=(i∑j=0[k∣j])−1=(i∑j=0[k∣j])−1=(i∑j=01kk−1∑i=0ωijk)−1
代入得到
n∑i=0(ni)pi⌊ik⌋=n∑i=0(ni)pii∑j=01kk−1∑d=0ωdjk−(n∑i=0(ni)pi)=1kk−1∑d=0n∑i=0(ni)pii∑j=0ωdjk−(p+1)n=1k(P+k−1∑d=1n∑i=0(ni)piωdi+dk−1ωdk−1)−(p+1)n=1k(P+k−1∑d=1∑ni=0(ni)pi(ωdi+dk−1)ωdk−1)−(p+1)n=1k(P+k−1∑d=1∑ni=0(ni)piωdi+dk−∑ni=0(ni)piωdk−1)−(p+1)n=1k(P+k−1∑d=1ωdk∑ni=0(ni)piωdik−∑ni=0(ni)piωdk−1)−(p+1)n=1k(P+k−1∑d=1ωdk(pωdk+1)n−(p+1)nωdk−1)−(p+1)n
上式中 P 是 d 等于零的情况,此时 ∑ij=0ωdjk 全为 1,公比为 1,不适用等比数列求和公式,我们单独算一下。由 (nm)m=(n−1m−1)n,有
P=n∑i=0(ni)pi(i+1)=(n∑i=0(ni)pii)+(p+1)n=(npn∑i=0(n−1i−1)pi−1)+(p+1)n=np(p+1)n−1+(p+1)n
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std;
inline int read(){
int w=0,x=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=x*10+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
const int maxn=(1<<10)+5,mod=998244353,g=3;
int n,p,k,ans,rt;
inline int fpow(int a,int b){int ans=1;for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) ans=1ll*ans*a%mod; return ans;}
inline void work(){
n=read(),p=read(),k=read(),rt=fpow(g,(mod-1)/k);
ans=(1ll*n*p%mod*fpow(p+1,n-1)+fpow(p+1,n))%mod;
for(int mul=rt,d=1;d<k;d++,mul=1ll*mul*rt%mod) ans=(ans+(1ll*mul*fpow((1ll*p*mul+1)%mod,n)%mod-fpow(p+1,n)+mod)%mod*fpow((mul-1+mod)%mod,mod-2))%mod;
ans=1ll*ans*fpow(k,mod-2)%mod;
printf("%d\n",(ans-fpow(p+1,n)+mod)%mod);
}
}
signed main(){
star::work();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现