【UOJ#450】[集训队作业2018] 复读机
题目描述
群里有\(k\)个不同的复读机。为了庆祝平安夜的到来,在接下来的\(n\)秒内,它们每秒钟都会选出一位优秀的复读机进行复读。非常滑稽的是,一个复读机只有总共复读了\(d\)的倍数次才会感到快乐。问有多少种不同的安排方式使得所有的复读机都感到快乐。
Sol
发现 \(d\) 只有 \(3\) , 很可能需要分开讨论。
\(d=1\) 就是 \(k^n\)
\(d=2\):
其实容易发现这是一个有次数限制的可重排列问题,那么可以使用指数型生成函数来解决。
一个复读机的生成函数就是:
\]
其实就是去除掉所有奇数项,那么这是一个常见的套路了,就是:
\]
泰勒展开后作差就是原来的式子了。
我们要求的东西就是:
\]
这里直接二项式定理展开:
\]
里面泰勒逆展开后发现 \([x^n]\) 下自带一个 \(n!\) ,所以最后的答案就是:
\]
\(d=3\):
仿照上面的式子有:
\]
无法使用常规方法化简。那么我们要使用一种更为本质的方法。
式子可以写成这样:
\]
用上单位根的性质:
\]
这之后常规套路移项然后合并次数
\]
所以又可以泰勒逆展开了:
\]
容易发现这个形式和 \(d=2\) 的相同,因为 \(d=2\) 做法的本质也是单位根反演,只不过因为单位根是 +-1 所以很容易手动容斥出来。
还是要求:
\]
直接展开:
\]
一样的泰勒逆展开然后取 \([x^n]\),最后的答案式就是:
\]
单位根用原根代替就行了。
code:
#include<bits/stdc++.h>
#define Set(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=5e5+10;
const int mod=19491001;
const int inv2=(mod+1)/2;
template <typename T> inline void init(T&x){
x=0;char ch=getchar();bool t=0;
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);
if(t) x=-x;return;
}
typedef long long ll;
template<typename T>inline void Inc(T&x,int y){x+=y;if(x>=mod) x-=mod;return;}
template<typename T>inline void Dec(T&x,int y){x-=y;if(x < 0) x+=mod;return;}
template<typename T>inline int fpow(int x,T k){int ret=1;for(;k;k>>=1,x=(ll)x*x%mod) if(k&1) ret=(ll)ret*x%mod;return ret;}
inline int Sum(int x,int y){x+=y;if(x>=mod) return x-mod;return x;}
inline int Dif(int x,int y){x-=y;if(x < 0 ) return x+mod;return x;}
int n,k,d;
int fac[N],finv[N];
inline void Sieve(int N){
fac[0]=finv[0]=fac[1]=finv[1]=1;
for(int i=2;i<=N;++i) finv[i]=(ll)(mod-mod/i)*finv[mod%i]%mod,fac[i]=(ll)fac[i-1]*i%mod;
for(int i=2;i<=N;++i) finv[i]=(ll)finv[i-1]*finv[i]%mod;
return;
}
inline int C(int n,int m){return n<m? 0:((ll)fac[n]*finv[m]%mod*finv[n-m]%mod);}
inline int Getroot(int mod){
static int pri[50];int x=mod-1;int cnt=0;
for(int i=2;i*i<=x;++i){
if(x%i==0) {
pri[++cnt]=i,x/=i;while(x%i==0) x/=i;
}
}
for(int g=2;;++g){
bool fl=1;
for(int i=1;i<=cnt;++i) if(fpow(g,(mod-1)/pri[i])==1) {fl=0;break;}
if(fl) return g;
}return 0;
}
int main()
{
init(n),init(k),init(d);
if(d==1) cout<<fpow(k,n)<<endl;
else {
Sieve(k);
if(d==2) {
int ans=0;
for(int i=0;i<=k;++i) Inc(ans,(ll)fpow(2*i-k,n)*C(k,i)%mod);
ans=(ll)ans*fpow(inv2,k)%mod;
cout<<ans<<endl;
}else{
int ans=0;int g=Getroot(mod);
int w0=1,w1=fpow(g,(mod-1)/3),w2=(ll)w1*w1%mod;
for(int i0=0;i0<=k;++i0) {
for(int i1=0;i1<=k;++i1){
if(i0+i1>k) break;
int i2=k-i0-i1;
Inc(ans,(ll)fpow(((ll)i0*w0%mod+(ll)i1*w1%mod+(ll)i2*w2%mod)%mod,n)*fac[k]%mod*finv[i0]%mod*finv[i1]%mod*finv[i2]%mod);
}
}
ans=(ll)ans*fpow(3,(ll)(mod-2)*k%(mod-1))%mod;
cout<<ans<<endl;
}
}
return 0;
}
【UOJ#450】[集训队作业2018] 复读机的更多相关文章
- uoj #450[集训队作业2018]复读机
传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...
- [2018集训队作业][UOJ450] 复读机 [DP+泰勒展开+单位根反演]
题面 传送门 思路 本文中所有$m$是原题目中的$k$ 首先,这个一看就是$d=1,2,3$数据分治 d=1 不说了,很简单,$m^n$ d=2 先上个$dp$试试 设$dp[i][j]$表示前$i$ ...
- UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp
LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- uoj450 【集训队作业2018】复读机(生成函数,单位根反演)
uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...
- UOJ #449. 【集训队作业2018】喂鸽子
UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...
- 【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= ...
- UOJ#422. 【集训队作业2018】小Z的礼物
#422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...
随机推荐
- 【HTML】---HTML语义化
1.什么是HTML语义化? <基本上都是围绕着几个主要的标签,像标题(H1~H6).列表(li).强调(strong em)等等> 根据内容的结构化(内容语义化),选择合适的标签(代码语义 ...
- AWSome Day简介
AWSome Day是什么? 它是一场为时一天.结合教育与技术新知的云计算技术免费研讨会.是面向所有开发人员.IT技术人员.或技术/业务领域决策者必备的基础云计算课程.AWS专业级讲师将在现场带领您从 ...
- P3611 【[USACO17JAN]Cow Dance Show奶牛舞蹈】
想了一下还是不发以前做过的水题了,意义也不是很大,现在的话大概只有洛谷黄题以上才会收录了哦~~~ 喵了个咪的题面~~ 洛谷题解dalao不是P党就是优先队列,看的我作为一个新手蒟蒻好慌啊... 这题用 ...
- XSS-反射型
前情提要:html的dom对象:document 如document.cookie / document.write() http://netsecurity.51cto.com/art/20131 ...
- 跨域设置之corsheaders
安装 pip install django-cors-headers 注册应用 INSTALLED_APPS = ( ... 'corsheaders', ... ) 中间层设置 MIDDLEWARE ...
- 交换机安全学习笔记 第八章 针对POE的攻击
POE即 Power over Ethernet 借助于以太网供电.最初为了IP电话,目前主要用于功耗小于15.4w的设备例如Ap和视频监控设备.并且简化了相关设备的电力线布线. 英文缩写注释:PSE ...
- keepalived 容器在宿主机重启后无法启动问题:报错:daemon is already running
初步猜测原因是:keepalived容器内的keepalived.pid文件在keepalived容器非正常退出时,没有正确删除,造成第二次启动时容器检查到pid文件已经存在,认为该进程已经存在,因为 ...
- Servlet概念及与Jsp的区别
一.Servlet概念 Servlet是在服务器上运行的小程序.一个Servlet就是一个Java类,并且可以通过”请求-响应”编程模型来访问这个驻留在服务器内存里的Servlet程序 二.Servl ...
- 不要64 数位DP
Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...
- php中文网--JavaScript
PHP中文网:http://www.php.cn/course/18.html 常用的两个客户端输出方法 document.write("你好呀js"); 描述:在网页的<b ...