P5591 小猪佩奇学数学

知识点

二项式定理

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

单位根反演

\[[n\mid k]=\frac 1n\sum_{i=0}^{n-1}\omega_n^{ik}
\]

证明:

\[[n\mid k]=\begin{cases}\frac 1n\sum_{i=0}^{n-1}\omega_n^{ik}=\frac 1n\sum_{i=0}^{n-1}1=1 &,n\mid k\\
\frac 1n\sum_{i=0}^{n-1}\omega_n^{ik}=\frac 1n\frac{\omega_n^k-\omega_n^{nk}}{1-\omega_n^k}=0 &,n\not\mid k\end{cases}
\]

题意

\[\sum_{i=0}^n\binom ni p^i\left\lfloor\frac ik\right\rfloor \pmod{998244353}
\]

\(1\le n,p\le998244353,k\in\{2^w|0\le w\le 20\}\)

思路

一看到前面这个形式容易想到二项式定理,但是后面这个 \(\left\lfloor\frac ik\right\rfloor\) 不好处理。

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

\[\left\lfloor\frac ik\right\rfloor=(\sum_{j=0}^i[k\mid j])-1=(\sum_{j=0}^i[k\mid j])-1=(\sum_{j=0}^i\frac 1k\sum_{i=0}^{k-1}\omega_k^{ij})-1
\]

代入得到

\[\begin{aligned}&\sum_{i=0}^n\binom ni p^i\left\lfloor\frac ik\right\rfloor\\
&=\sum_{i=0}^n\binom ni p^i\sum_{j=0}^i\frac 1k\sum_{d=0}^{k-1}\omega_k^{dj}-(\sum_{i=0}^n\binom ni p^i)\\
&=\frac 1k\sum_{d=0}^{k-1}\sum_{i=0}^n\binom ni p^i\sum_{j=0}^i\omega_k^{dj}-(p+1)^n\\
&=\frac 1k(P+\sum_{d=1}^{k-1}\sum_{i=0}^n\binom ni p^i\frac{\omega_k^{di+d}-1}{\omega_k^d-1})-(p+1)^n\\
&=\frac 1k(P+\sum_{d=1}^{k-1}\frac{\sum_{i=0}^n\binom ni p^i(\omega_k^{di+d}-1)}{{\omega_k^d-1}})-(p+1)^n\\
&=\frac 1k(P+\sum_{d=1}^{k-1}\frac{\sum_{i=0}^n\binom ni p^i\omega_k^{di+d}-\sum_{i=0}^n\binom ni p^i}{{\omega_k^d-1}})-(p+1)^n\\
&=\frac 1k(P+\sum_{d=1}^{k-1}\frac{\omega_k^d\sum_{i=0}^n\binom ni p^i\omega_k^{di}-\sum_{i=0}^n\binom ni p^i}{{\omega_k^d-1}})-(p+1)^n\\
&=\frac 1k(P+\sum_{d=1}^{k-1}\frac{\omega_k^d(p\omega_k^d+1)^n-(p+1)^n}{{\omega_k^d-1}})-(p+1)^n
\end{aligned}
\]

上式中 \(P\) 是 \(d\) 等于零的情况,此时 \(\sum_{j=0}^i\omega_k^{dj}\) 全为 1,公比为 1,不适用等比数列求和公式,我们单独算一下。由 \(\binom nmm=\binom {n-1}{m-1}n\),有

\[\begin{aligned}
P&=\sum_{i=0}^n\binom ni p^i(i+1)\\
&=(\sum_{i=0}^n\binom ni p^ii)+(p+1)^n\\
&=(np\sum_{i=0}^n\binom {n-1}{i-1} p^{i-1})+(p+1)^n\\
&=np(p+1)^{n-1}+(p+1)^n
\end{aligned}
\]

代码

#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;
}

P5591 小猪佩奇学数学的更多相关文章

  1. Luogu5591 小猪佩奇学数学 【单位根反演】

    题目链接:洛谷 \[ Ans=\frac{1}{k}(\sum_{i=0}^n\binom{n}{i}p^ii-\sum_{i=0}^n\binom{n}{i}p^i(i \ \mathrm{mod} ...

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

    正题 题目链接:https://www.luogu.com.cn/problem/P5591 题目大意 给出\(n,p,k\)求 \[\left(\sum_{i=0}^n\binom{n}{i}p^i ...

  3. 使用canvas 代码画小猪佩奇

    最近不是小猪佩奇很火嘛!!! 前几天 在知乎 看见了别人大佬用python写的 小猪佩奇,  顿时想学 ,可是 自己 没学过python(自己就好爬爬图片,,,,几个月没用 又丢了) 然后 就想画一个 ...

  4. 用CSS画小猪佩奇,你就是下一个社会人!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯,这是我的爸爸,嚯~ 背景 小猪佩奇已经火了好 ...

  5. Python爬虫入门教程 45-100 Charles抓取兔儿故事-下载小猪佩奇故事-手机APP爬虫部分

    1. Charles抓取兔儿故事背景介绍 之前已经安装了Charles,接下来我将用两篇博客简单写一下关于Charles的使用,今天抓取一下兔儿故事里面关于小猪佩奇的故事. 爬虫编写起来核心的重点是分 ...

  6. 运用python绘制小猪佩奇

    用python绘制小猪佩奇 1.打开idle 2.点击File-New Files 3.输入以下代码 1. from turtle import * 2. 3. def nose(x,y):#鼻子 4 ...

  7. python 画个小猪佩奇

    不知道大家小时候有没有学习过logo语言,就是操纵一只小王八,来画各种图案.博主小学微机课就学习了这个,最近发现python的turtle包就是logo语言,所以画个小猪佩奇和大家分享. 代码来自知乎 ...

  8. PS学习之小猪佩奇身上纹,掌声送给社会人

    首先准备素材 用ps首先打开素材一 首先对图片去色 快捷键:shift+Ctrl+u 调整色阶 设置高斯模糊: 另存为psd格式,命名为叠加的对象 再次打开素材一,把佩奇拖入到图层里,并调整大小,旋转 ...

  9. 如何优雅的使用C语言绘制一只小猪佩奇

    今天我们来用C语言画一只小猪佩奇---社会.社会....在画小猪佩奇之前,我们先使用带符号的距离长 (signed distance field,SDF) 来画一个圆形. 使用这个方法表示形状,但是这 ...

随机推荐

  1. Python-selenium,切换句柄及封装

    一.获取当前句柄及所有句柄 handle=driver.current_window_handle #获取当前窗口句柄print(handle)handles=driver.window_handle ...

  2. Linux基础_vim命令

    简介:Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. vi/vim 共分为三种模式,分别是命令模式(Command mode)也叫 ...

  3. jvm相关自我总结和 VisualVM工具的使用

    idea 二个工具: jclasslib Hexview jdk监控工具 VisualVM工具的使用: https://www.ibm.com/developerworks/cn/java/j-lo- ...

  4. 二、Linux基本防护措施

    修改账户有效期 chage命令的语法格式: chage –l    账户名称                                //查看账户信息 chage –E 时间 账户名称      ...

  5. 自动化工具之Appium工具简单介绍

    背景 自动化,性能测试,接口测试,开发平台等工作,到底测试的价值在哪里,其实价值来源不断充实与为大众服务,今天简单介绍ui小工具appium攻击. 简单介绍 Appium 是一个自动化测试开源工具,支 ...

  6. 「10.29」数列(exgxd)·数对(线段树优化DP)·最小距离(最短路,树上直径思想)

    好久没碰到这么友好乱搞的题了.... A. 数列 考察的是exgcd的相关知识,最后的答案直接O(1)求即可 B. 数对 本来以为是原题,然后仔细看了看发现不是,发现不会只好乱搞骗分了 事实上直接按$ ...

  7. .NET Core/.NET5/.NET6 开源项目汇总6:框架与架构设计(DDD、云原生/微服务/容器/DevOps/CICD等)项目

    系列目录     [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...

  8. 复习Spring第三课--数据源配置的多种方式

    spring数据源配置可以说分为:spring容器自带连接池.项目中创建连接池.服务器创建连接池三种 一.spring容器自带连接池   Spring本身也提供了一个简单的数据源实现类DriverMa ...

  9. Go语言中的有缓冲channel和无缓冲channel区别

    Go语言中的有缓冲channel和无缓冲channel区别 结论 ch1:=make(chan int)// 无缓冲 ch2:=make(chan int,1)// 有缓冲 无缓冲: 当向ch1中存值 ...

  10. NTLM协议与Pass the Hash的爱情

    0x01.前言 NTLM使用在Windows NT和Windows 2000 Server或者之后的工作组环境中(Kerberos用在域模式下).在AD域环境中,如果需要认证Windows NT系统, ...