uoj450 【集训队作业2018】复读机(生成函数,单位根反演)
uoj450 【集训队作业2018】复读机(生成函数,单位根反演)
题解时间
首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] \frac{ x^{ i } }{ i! } $ 。
容易想到直接上单位根反演:
\sum\limits_{ i = 0 }^{ k } [ d | i ] \frac{ x^{ i } }{ i! }
& = \sum\limits_{ i = 0 }^{ k } \frac{ 1 }{ d } \sum\limits_{ j = 0 }^{ d - 1 } \omega_{ d }^{ ij } \frac{ x^{ i } }{ i! } \\
& = \frac{ 1 }{ d } \sum\limits_{ j = 0 }^{ d - 1 } \sum\limits_{ i = 0 }^{ k } \frac{ ( \omega_{ d }^{ j } x )^{ i } }{ i! } \\
& = \frac{ 1 }{ d } \sum\limits_{ j = 0 }^{ d - 1 } e^{ ( \omega_{ d }^{ j } x )^{ i } }
\end{aligned}
\]
然后答案就是 $ [ x^{ n } ] ( \frac{ 1 }{ d^{ k } } ( \sum\limits_{ j = 0 }^{ d - 1 } e^{ \omega_{ d }^{ j } x } )^{ k } ) $ 。
由于 $ d \le 3 $ ,所以直接大力二项式定理,时间复杂度 $ O( d k^{d-1} \log{ k } ) $ 。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
namespace RKK
{
const int N=500011;
const int mo=19491001;
const int g=7,om=18827933;
void doadd(int &a,int b){if((a+=b)>=mo) a-=mo;}int add(int a,int b){return (a+=b)>=mo?a-mo:a;}
void dodec(int &a,int b){doadd(a,mo-b);}int dec(int a,int b){return add(a,mo-b);}
void domul(int &a,int b){a=1ll*a*b%mo;}int mul(int a,int b){return 1ll*a*b%mo;}
int fpow(int a,int p){int ret=1;while(p){if(p&1) domul(ret,a);domul(a,a),p>>=1;}return ret;}
int inv[N],fac[N],ifac[N];
void init()
{
inv[1]=1;for(int i=2;i<=500000;i++) inv[i]=mul(inv[mo%i],mo-mo/i);
for(int i=fac[0]=1;i<=500000;i++) fac[i]=mul(fac[i-1],i);
for(int i=ifac[0]=1;i<=500000;i++) ifac[i]=mul(ifac[i-1],inv[i]);
}
int C(int n,int m){if(n<m||n<0||m<0) return 0;return mul(fac[n],mul(ifac[n-m],ifac[m]));}
int n,m,d,ans;
int main()
{
init();
read(n,m,d);
switch(d)
{
case 1:
ans=fpow(m,n);
break;
case 2:
for(int i=0;i<=m;i++) doadd(ans,mul(C(m,i),fpow(dec(i*2,m),n)));
break;
case 3:
for(int i=0;i<=m;i++)for(int j=0;i+j<=m;j++)
doadd(ans,mul(mul(C(m,i),C(m-i,j)),fpow(add(m-i-j,add(mul(om,i),mul(mul(om,om),j))),n)));
break;
}
domul(ans,fpow(inv[d],m));
printf("%d\n",ans);
return 0;
}
}
int main(){return RKK::main();}
uoj450 【集训队作业2018】复读机(生成函数,单位根反演)的更多相关文章
- uoj #450[集训队作业2018]复读机
传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...
- 【UOJ#450】[集训队作业2018] 复读机
题目链接 题目描述 群里有\(k\)个不同的复读机.为了庆祝平安夜的到来,在接下来的\(n\)秒内,它们每秒钟都会选出一位优秀的复读机进行复读.非常滑稽的是,一个复读机只有总共复读了\(d\)的倍数次 ...
- uoj#450. 【集训队作业2018】复读机(单位根反演)
题面 传送门 题解 我的生成函数和单位根反演的芝士都一塌糊涂啊-- \(d=1\),答案就是\(k^n\)(因为这里\(k\)个复读机互不相同,就是说有标号) \(d=2\),我们考虑复读机的生成函数 ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- UOJ #449. 【集训队作业2018】喂鸽子
UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- UOJ#418. 【集训队作业2018】三角形
#418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...
- 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物
T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...
随机推荐
- Solution -「POI 2011」「洛谷 P3527」MET-Meteors
\(\mathcal{Description}\) Link. 给定一个大小为 \(n\) 的环,每个结点有一个所属国家.\(k\) 次事件,每次对 \([l,r]\) 区间上的每个点点权加上 ...
- 【lwip】lwip源码基础
目录 前言 概念&作用 网络接口 概念引入 总结 lwip netif 结构体 链接 字段分析 网卡链表 网络 IP 接收数据函数 发送数据函数 ARP 模块调用的发送函数 出口回调函数 用户 ...
- MyBatis功能点二应用:第三方分页插件使用
pageHelper分⻚插件使用 在前面文章MyBatis功能点二:plugins插件使用 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了自定义插件的使用,本文介绍第三方插件pa ...
- 施耐德NOE77101后门漏洞分析
固件下载地址: GitHub - ameng929/NOE77101_Firmware 文件目录结构,这里只列出了一些主要的文件信息: ├── bin ├── ftp ├── fw ├── rdt ├ ...
- [杂记]对RSA算法的数学原理的一点思考
- python的字符串切片技术
听说过python的字符串切片技术吗?是不是听着超高级的?实际上,也不用想得太难,python的字符串切片技术就是将字符串的某些字符提取出来而已~ 字符串切片 字符串是一种序列类型,可以按序号访问其中 ...
- 【C#基础概念】字面量 literal
一.字面量定义 在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation).几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串:而有很 ...
- Java课程设计---学生信息管理系统需求分析及总体设计
按照软件工程实践的原则,开发大型程序需要经历需求分析.总体设计.详细设计.编码实现.系统测试.系统维护等几个阶段. 1.需求分析 本阶段是整个软件开发过程中最重要的环节.通过了解实际运行的系统或与用户 ...
- Qt:QUrl
1.说明 概述 一个代表URL的类,此外还支持国际域名(IDNs). 通常在初始化时传入QString构造QUrl,除此之外还能用setUrl(). URL有两种表示格式:编码.未编码.未编码URL常 ...
- (转载)虚拟化(3):os调度策略。
转自:https://zhuanlan.zhihu.com/p/38046313 这一章主要是介绍几个简单的调度器策略.内容比较简单,就简单汇总下. 首先我们对现有的计算机环境有如下几个假设: 1.每 ...