[P4921] 情侣?给我烧了!
回顾一下错排公式
错排问题:
设n位错排数为D[n]。考虑元素1的位置,设置为k(有n-1中 );在考虑元素k的位置,
若为1,则转换为n-2位的错排;否则,视元素k为元素1(不能放在位置1),转换为n-1位的错排。
故 D[n]=(n-1)(D[n-1]+D[n-2]) D[1]=0 D[2]=1
也有公式D[n]=n!/e (e=1-1/1!+1/2!-1/3!+……+(-1)^n*1/n!)
设g(x)为x对情侣都在x排里都错开的方案数。
对于询问的k,其答案=C(n,k)A(n,k)pow(2,k)*g(n-k)
式子从左到右依次表示:
1)在n排中选出k排
2)每对情侣中占某一排排
3)情侣双方的位置互调
4)剩下n-k对情侣都要错开。
然后考虑g(x)的算法。
这是就要联想到错排序列的构造方法。
考虑第一排的情况:
1)俩男(x(x-1)种),考虑他们对应的俩女
a)这俩女在同一排((x-1)2种方案),此时转化为g(x-2)。
b)这俩女不在同一排, 就把她们当做一对情侣,转化为g(x-1)
2)俩女,与俩男同
3)左男右女,仔细想想是与俩男还是一样的。
4)左女右男,仔细想想是与俩男还还是一样的。
故转移为g(x)=(1+1+1+1)(x(x-1)((x-1)2*g(x-2)+g(x-1)))=4x(x-1)(2(x-1)g(x-2)+g(x-1))
显然g(1)=0, g(2)=8 //于是g(0)=1...
时间复杂图 O(Tn)
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+7;
const int P=998244353;
int fac[N]={1};
int inv[N]={0,1};
int fiv[N]={1};
int g[N]={1};
int b[N]={1};
inline int C(int x,int y) {
return 1LL*fac[x]*fiv[y]%P*fiv[x-y]%P;
}
inline int A(int x,int y) {
return 1LL*fac[x]*fiv[x-y]%P;
}
inline int f(int n,int k) {
return 1LL*C(n,k)%P*A(n,k)%P*b[k]%P*g[n-k]%P;
}
int main() {
for(int i=1; i<N; ++i) fac[i]=1LL*fac[i-1]*i%P;
for(int i=2; i<N; ++i) inv[i]=1LL*(P-P/i)*inv[P%i]%P;
for(int i=1; i<N; ++i) fiv[i]=1LL*inv[i]*fiv[i-1]%P;
for(int i=2; i<N; ++i) g[i]=4LL*i*(i-1)%P*(2LL*(i-1)*g[i-2]%P+g[i-1])%P;
for(int i=1; i<N; ++i) b[i]=b[i-1]*2LL%P;
int T,n;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int k=0; k<=n; ++k) {
printf("%d\n",f(n,k));
}
}
return 0;
}
[P4921] 情侣?给我烧了!的更多相关文章
- 洛谷P4931 情侣!给我!烧了! 数论
正解:数论 解题报告: 传送门 这题,想不到就很痛苦,但是理解了之后还是觉得也没有很难,,,毕竟实现不难QAQ 首先关于前面k对情侣的很简单,就是C(n,k)*C(n,k)*A(k,k)*2k 随便解 ...
- 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...
- 洛谷P2194 HXY烧情侣
题目描述 众所周知,\(HXY\)已经加入了\(FFF\)团.现在她要开始喜\((sang)\)闻\((xin)\)乐\((bing)\)见\((kuang)\)地烧情侣了.这里有\(n\)座电影院, ...
- HXY烧情侣(洛谷 2194)
题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要 ...
- HXY烧情侣
题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要 ...
- P2194 HXY烧情侣【Tarjan】
前言 当时和\(GYZ\)大佬一起做这个题,他表示这个题对他很不友好(手动滑稽) 题目描述 众所周知,\(HXY\) 已经加入了 \(FFF\) 团.现在她要开始喜(sang)闻(xin)乐(bing ...
- 租酥雨的NOIP2018赛前日记
租酥雨的NOIP2018赛前日记 离\(\mbox{NOIP2018}\)只剩下不到一个月的时间辣! 想想自己再过一个月就要退役了,觉得有必要把这段时间的一些计划与安排记录下来. 就从国庆收假开始吧. ...
- P4921 【情侣?给我烧了!】
加强前这道题还是比较友好的 首先我们设\(g_x\)为x对情侣没有一对坐在一起的数量 然后答案就可以表示成:\(C_n^k*A_n^k*2^k*g_{n-k}\) 这里的复杂度是\(O(T*N)\), ...
- 【Luogu4931】情侣?给我烧了! 加强版(组合计数)
[Luogu4931]情侣?给我烧了! 加强版(组合计数) 题面 洛谷 题解 戳这里 忽然发现我自己推的方法是做这题的,也许后面写的那个才是做原题的QwQ. #include<iostream& ...
随机推荐
- dagScheduler
由一个action动作触发sparkcontext的runjob,再由此触发dagScheduler.runJob,然后触发submitJob,封装一个JobSubmitted放入一个队列.然后再通过 ...
- AS3中的getChildByName
[转载的...............] 在AS3中,我们可以用getChildByName来获取一个元件,但是要注意返回的类型是DisplayObject,这样一旦我们的元件中有一些自定义的方法就不 ...
- geckodriver问题
selenium.common.exceptions.WebDriverException: Message: Service geckodriver unexpectedly exited. Sta ...
- Curator框架基础使用
为了更好的实现java操作zookeeper服务器.后来出现Curator框架,非常强大,目前已经是Apache的顶级项目,有丰富的操作,,例如:session超时重连,主从选举.分布式计数器,分布式 ...
- Eigen使用矩阵作为函数参数
1 使用矩阵作为函数参数介绍 文章来源Writing Functions Taking %Eigen Types as Parameters Eigen为了在函数中传递不同的类型使用了表达式模板技术. ...
- 选择困难症的福音——团队Scrum冲刺阶段-Day 7
选择困难症的福音--团队Scrum冲刺阶段-Day 7 今日进展 测试代码 将界面设计完后放app使用示意图于此 今日贡献量 严域俊 吴恒佚 曾程 刘辰 邓煜坤 3.5 3.5 3.3 3.6 3 贡 ...
- ----一个roadmap----
在课上了解到了学web前端三个基础,HTML.CSS.JS 从HTML开始,逐步学习CSS.JS 大致写了一个roadmap(应该是roadmap喔 就是这样,以后可能会来更错或者更新 对没错我来更错 ...
- python之高阶函数
1.函数的参数能接收变量 def calc(x): return x*x n = 10 print(calc(n)) #输出为100 2.变量指向函数 def calc(x): return x*x ...
- ssh 配置免密失败
多数情况下,可以登录成功.但是也会出现配置不正确,导致失败的时候. 1.检查authorized_keys文件权限,并设置为700 chmod 700 authorized_keys 2.检查/etc ...
- linux 查看机器cpu核数
CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 查看CPU信息(型号) [root@AAA ~]# cat /p ...