P5591 小猪佩奇学数学

P5591 小猪佩奇学数学

知识点

二项式定理

(x+1)n=i=0n(ni)xi

单位根反演

[nk]=1ni=0n1ωnik

证明:

[nk]={1ni=0n1ωnik=1ni=0n11=1,nk1ni=0n1ωnik=1nωnkωnnk1ωnk=0,nk

题意

i=0n(ni)piik(mod998244353)

1n,p998244353,k{2w|0w20}

思路

一看到前面这个形式容易想到二项式定理,但是后面这个 ik 不好处理。

观察一下数据范围发现 k 较小,考虑使用单位根反演,我们将柿子往这边化:

ik=(j=0i[kj])1=(j=0i[kj])1=(j=0i1ki=0k1ωkij)1

代入得到

i=0n(ni)piik=i=0n(ni)pij=0i1kd=0k1ωkdj(i=0n(ni)pi)=1kd=0k1i=0n(ni)pij=0iωkdj(p+1)n=1k(P+d=1k1i=0n(ni)piωkdi+d1ωkd1)(p+1)n=1k(P+d=1k1i=0n(ni)pi(ωkdi+d1)ωkd1)(p+1)n=1k(P+d=1k1i=0n(ni)piωkdi+di=0n(ni)piωkd1)(p+1)n=1k(P+d=1k1ωkdi=0n(ni)piωkdii=0n(ni)piωkd1)(p+1)n=1k(P+d=1k1ωkd(pωkd+1)n(p+1)nωkd1)(p+1)n

上式中 Pd 等于零的情况,此时 j=0iωkdj 全为 1,公比为 1,不适用等比数列求和公式,我们单独算一下。由 (nm)m=(n1m1)n,有

P=i=0n(ni)pi(i+1)=(i=0n(ni)pii)+(p+1)n=(npi=0n(n1i1)pi1)+(p+1)n=np(p+1)n1+(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;
}
posted @   Star_Cried  阅读(91)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示