P5591-小猪佩奇学数学【单位根反演】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P5591


1|1题目大意

给出n,p,k

(i=0n(ni)piik)mod998244353

1n,p<998244353,k=2w(w[0,20])


1|2解题思路

开始以为推错了,结果是要特判
推出了看上去不是我能推的式子

i=1n(ni)pij=1i[k|j]

然后单位根反演

i=1n(ni)pij=1i1kl=0k1ωkl×j

系统整理一下

1kl=0k1i=1n(ni)pij=1iωkl×j

然后等比数列通项公式拆开

1kl=0k1i=1n(ni)piωklωkliωkl1ωkl

1kl=0kωkl1ωkl(i=1n(ni)pii=1n(ni)piωkli)

1kl=0kωkl1ωkl((p+1)n(pωkl+1)n)

然后写出来会愉快的发现没有过样例,仔细看我们式子里面有一个ωkl1ωkl

l=0 的时候1ωkl=0,所以不能直接这么求,我们这个得分开考虑。

就是

i=1n(ni)piii=1nn!(i1)!(ni)!pi

npi=1n(n1)!(i1)!(ni)!pi1ni=1n(n1i)pi1np(p+1)n1

就好了

时间复杂度:O(klogP)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll P=998244353; ll n,p,k,ans; ll power(ll x,ll b){ ll ans=1;x%=P; while(b){ if(b&1)ans=ans*x%P; x=x*x%P;b>>=1; } return ans; } signed main() { scanf("%lld%lld%lld",&n,&p,&k); ll d=power(3,(P-1)/k); ans=n*p%P*power(p+1,n-1)%P; for(ll i=1,w=d;i<k;i++,w=w*d%P){ ll inv=power(P+1-w,P-2)*w%P; ans+=power(p+1,n)*inv%P; ans-=power(w*p+1,n)*inv%P; ans=(ans+P)%P; } printf("%lld\n",ans*power(k,P-2)%P); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15255634.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(70)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示