Problem

简单版 & 加强版

题目概要(其实题面写得很清楚,这里搬运一下):

\(n\) 对情侣排座位,恰有 \(n\) 排座位,每排 \(2\) 个座位,在一个就座方案中所有人会将将座位坐满(共有 \((2n)!\) 种不同的就坐方案。)

求出共有多少种不同的就坐方案满足恰好有 \(k\) 对情侣坐在一排

  • 简单版:给出 \(T\leq 10^3\) 组数据,每组数据给出 \(n\leq 10^3\),对于每个 \(k\in [0,n]\) 输出
  • 加强版:给出 \(T\leq 2\times 10^5\) 组数据,每组数据给出 \(n\leq 5\times 10^6\),对于给出的 \(k\in[0,n]\) 输出

每组询问间 \(n,k\) 不保证相同

Complains

这题目名……让很久没见妹子的我很是心酸啊……

写完简单版发现可以直接过加强版,于是就把这两题写在一起了啦 这题为啥是黑题啊

本来想容斥搞事的,结果推出来始终过不了样例

但估计有简单版和加强版之分,估计简单版是容斥,求dalao指教怎么容斥啊

Solution

然后就尝试着直接做,那对于恰有 \(k\) 对情侣的就坐方案,首先要选出 \(k\) 对情侣 \(\binom nk\),然后要给他们安排对应的位置 \(P_n^k\),再算上一排座位间怎么坐都是一样的 \(2^n\),最后要限制其他 \(n-k\) 对情侣都不在一排

最后一个问题明显是错排,错排的式子是 \(D_n=(n-1)(D_{n-1}+D_{n-2})\),是由增量法得到的

在这题里,情侣之间不好考虑,然后错排中每加入两个人,和传统的错排一样,只是两个人要选择一个调换到前边去,所以要乘 \(2\),所以得到递推式为 \(d_i=2(i-1)(d_{i-1}+d_{i-2})\),最后要乘上加入的顺序 \(i!\)

所以最后的答案为

\[Ans=C_n^k\cdot P_n^k\cdot 2^n\cdot (n-k)!\cdot d_{n-k}
\]

所以这种 \(O(n)\) 预处理 \(O(1)\) 查询的做法两道题都能过

Code

简单版

#include <cstdio>
typedef long long ll; const int N=1013,p=998244353;
int fac[N],inv[N],g[N],f[N],pw2[N];
int n; inline int C(int nn,int mm){return (ll)fac[nn]*inv[mm]%p*inv[nn-mm]%p;}
inline int P(int nn,int mm){return (ll)fac[nn]*inv[nn-mm]%p;} inline int qpow(int A,int B){
int res(1);while(B){
if(B&1)res=(ll)res*A%p;
A=(ll)A*A%p,B>>=1;
}return res;
} int main(){
pw2[1]=2;inv[0]=g[0]=1;
fac[0]=fac[1]=pw2[0]=1;
for(int i=2;i<N;++i){
fac[i]=(ll)fac[i-1]*i%p;
pw2[i]=2ll*pw2[i-1]%p;
g[i]=2ll*(i-1)*(g[i-1]+g[i-2])%p;
}
inv[N-1]=qpow(fac[N-1],p-2);
for(int i=N-2;i;--i)inv[i]=(ll)inv[i+1]*(i+1)%p; int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<=n;++i)
printf("%lld\n",(ll)C(n,i)*P(n,i)%p *pw2[n]%p *fac[n-i]%p *g[n-i]%p);
}
}

加强版

#include <bits/stdc++.h>
typedef long long ll; inline void read(int&x){
char c11=getchar();x=0;while(!isdigit(c11))c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();
} const int N=5001001,p=998244353;
int fac[N],inv[N],g[N],f[N],pw2[N];
int n; inline int C(int nn,int mm){return (ll)fac[nn]*inv[mm]%p*inv[nn-mm]%p;}
inline int P(int nn,int mm){return (ll)fac[nn]*inv[nn-mm]%p;} inline int qpow(int A,int B){
int res(1);while(B){
if(B&1)res=(ll)res*A%p;
A=(ll)A*A%p,B>>=1;
}return res;
} int main(){
pw2[1]=2;inv[0]=g[0]=1;
fac[0]=fac[1]=pw2[0]=1;
for(int i=2;i<N;++i){
fac[i]=(ll)fac[i-1]*i%p;
pw2[i]=2ll*pw2[i-1]%p;
g[i]=2ll*(i-1)*(g[i-1]+g[i-2])%p;
}
inv[N-1]=qpow(fac[N-1],p-2);
for(int i=N-2;i;--i)inv[i]=(ll)inv[i+1]*(i+1)%p; int T,n,k;read(T);
while(T--){
read(n),read(k);
printf("%lld\n",(ll)C(n,k)*P(n,k)%p *pw2[n]%p *fac[n-k]%p *g[n-k]%p);
}return 0;
}

题解-洛谷4921&4931 情侣?给我烧了!(加不加强无所谓版)的更多相关文章

  1. 洛谷 P4931 - [MtOI2018]情侣?给我烧了!(加强版)(组合数学)

    洛谷题面传送门 A 了这道题+发这篇题解,就当过了这个七夕节吧 奇怪的过节方式又增加了 首先看到此题第一眼我们可以想到二项式反演,不过这个 \(T\) 组数据加上 \(5\times 10^6\) 的 ...

  2. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  3. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  4. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  5. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  6. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

  7. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...

  8. 题解-洛谷P5217 贫穷

    洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...

  9. 题解 洛谷 P2010 【回文日期】

    By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...

随机推荐

  1. Nginx记录-Nginx基础(转载)

    1.Nginx常用功能 1.Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理. Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能.Nginx可以根据不同的 ...

  2. [JUC-1]并发包实现及线程状态

    一.Java 并发包实现 二.Java 线程状态转换图

  3. sc (service control )

    SC 是用来与服务控制管理器和服务进行通信 net: net start 服务名 net stop 服务名 sc: sc config 服务名 start= demand    //手动 sc con ...

  4. Nginx 学习笔记(八)http和https跨域问题解决

    今天在做网易云信的时候,修改了一下源码,使用自己的服务端进行登陆, 注意:这里是使用http域名访问https域名 1.下载源码,配置了IM的域名,im.tinywan.com 没有开启https,具 ...

  5. (一)python的前世今生

    一:Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum)(目前还活着),诞生于1989年,是一个脚本解释程序,由于python语言结构优美,清晰简单,随着人工智能 ...

  6. 【解题报告】SRM-08

    A Description 给一个 01 串设为其 S,询问是否存在只出现两次的 01 串 T. 这里的出现定义为存在一串下标 ,满足  且 . Input 一行,一个 01 串 Output 一行, ...

  7. My97DatePicker 只显示月份

    <script src="../javascript/My97DatePicker/WdatePicker.js" type="text/javascript&qu ...

  8. luogu P3899 [湖南集训]谈笑风生

    传送门 nmyzd,mgdhls,bnmbzdgdnlql,a,wgttxfs 对于一个点\(a\),点\(b\)只有可能是他的祖先或者在\(a\)子树里 如果点\(b\)是\(a\)祖先,那么答案为 ...

  9. SQL Server查询数据库所有存储过程、触发器、索引信息SQL分享

    1. 查询所有存储过程 1 select Pr_Name as [存储过程], [参数]=stuff((select ','+[Parameter] 2 from ( 3 select Pr.Name ...

  10. 利用html5中json的方法做对象的深拷贝解决引用的相互干扰

    var a=[name:'zs']; var str=Json.stringify(a); var b=Json.parse(str);//这里是将一个新对象赋值给b.与a没有引用同一个对象 b.na ...