洛谷传送门1

洛谷传送门2

题目描述

有 nnn 对情侣来到电影院观看电影。在电影院,恰好留有 nnn 排座位,每排包含 222 个座位,共 2×n2×n2×n 个座位。

现在,每个人将会随机坐在某一个位置上,且恰好将这 2×n2 × n2×n 个座位坐满。

如果一对情侣坐在了同一排的座位上,那么我们称这对情侣是和睦的。

你的任务是求出共有多少种不同的就坐方案满足恰好有 kkk 对情侣是和睦的。

两种就坐方案不同当且仅当存在一个人在两种方案中坐在了不同的位置。不难发现,在没有任何限制条件的情况下,每个人任意就坐一共会有 (2n)!(2n)!(2n)! 种不同的就坐方案。

输入输出格式

输入格式:

输入包含多组数据。

输入的第一行包含一个正整数 TTT,表示数据组数。

接下来 TTT 行,每行包含两个非负整数 n,kn, kn,k,其意义见题目描述。

输出格式:

对于每组输入数据,输出一行,表示对应的就坐方案数。由于结果可能较大,因此输出对 998244353998244353998244353 取模的结果。

输入输出样例

输入样例#1:

5
1 1
2 0
2 2
2333 666
2333333 1000000

输出样例#1:

2
16
8
798775522
300377435

说明

对于 10%10 \%10% 的数据,满足 1≤T≤10,1≤n≤51 \leq T \leq 10, 1 \leq n \leq 51≤T≤10,1≤n≤5
对于 40%40 \%40% 的数据,满足 1≤n≤3×1031 \leq n \leq 3 \times 10^31≤n≤3×103
对于 100%100 \%100% 的数据,满足 1≤T≤2×105,1≤n≤5×106,0≤k≤1 \leq T \leq 2 \times 10^5, 1 \leq n \leq 5 \times 10^6, 0 \leq k \leq1≤T≤2×105,1≤n≤5×106,0≤k≤ n

解题分析

这道题可以利用O(N2)O(N^2)O(N2)处理错排得到科学的答案, 然而这里需要O(N)O(N)O(N)递推。

首先我们可以得到这样的一个式子:
ans=(nk)2×k!×2k×D[n−k]ans=\binom{n}{k}^2\times k!\times 2^k\times D[n-k] ans=(kn​)2×k!×2k×D[n−k]
具体而言是这样的: nnn对里面选出kkk对, 可以放在(nk)\binom{n}{k}(kn​)个位置上, 然后还有k!k!k!种排列方式。 这些情侣可以交换左右, 所以要乘上2k2^k2k。 后面的D[n−k]D[n-k]D[n−k]表示剩下的人的错排方案数。

那么问题就在这个错排数了。 考虑我们已经推到了D[n−1]D[n-1]D[n−1], 考虑第nnn对。

那么我们可以选一个位置先让一个人做下, 显然有2n2n2n个。 然后从其他对里面抽一个人过来和他配对, 共有2n−22n-22n−2种方案。

现在我们再考虑这两对中的没有配对的另外两个人。

  • 如果这两对互相配对了, 那么其他两个人可以选n−1n-1n−1排中的任何一排,并且可以左右互换, 然后问题就变成了n−2n-2n−2对的错排数, 所以方案数为2×(n−1)×D[n−2]2\times (n-1)\times D[n-2]2×(n−1)×D[n−2]。
  • 如果没有配对, 那么我们可以假设他们是一对, 然后问题就变成了n−1n-1n−1对的错排数。

所以递推式为D[n]=2n(2n−2)(D[n−1]+2(n−1)D[n−2])D[n]=2n(2n-2)(D[n-1]+2(n-1)D[n-2])D[n]=2n(2n−2)(D[n−1]+2(n−1)D[n−2])。

然后处理出阶乘、阶乘逆元、222的次幂和错排数即可O(1)O(1)O(1)回答。

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <cstring>
#include <algorithm>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define MX 5000050
#define MOD 998244353ll
#define ll long long
int fac[MX], inv[MX], pw[MX], D[MX];
void pre()
{fac[0] = inv[0] = inv[1] = fac[1] = pw[0] = D[0] = 1; pw[1] = 2;for (R int i = 2; i <= 5e6; ++i) {fac[i] = 1ll * fac[i - 1] * i % MOD;inv[i] = 1ll * inv[MOD % i] * (MOD - MOD / i) % MOD;pw[i] = pw[i - 1] * 2 % MOD;D[i] = 1ll * 4 * i * (i - 1) % MOD * ((D[i - 1] + 1ll * D[i - 2] * 2 % MOD * (i - 1) % MOD) % MOD) % MOD;}for (R int i = 2; i <= 5e6; ++i) inv[i] = 1ll * inv[i - 1] * inv[i] % MOD;
}
IN int C(R int n, R int m) {return 1ll * fac[n] * inv[m] % MOD * inv[n - m] % MOD;}
IN int calc(R int n, R int k) {return 1ll * C(n, k) * C(n, k) % MOD * fac[k] % MOD * pw[k] % MOD * D[n - k] % MOD;}
int main(void)
{using namespace std;ios_base::sync_with_stdio(false);int T, n, m;cin >> T; pre();W (T--){cin >> n >> m;cout << calc(n, m) << endl;}
}

[Luogu P4921] [Luogu P4931] 情侣 给我烧了(加强版)相关推荐

  1. luogu P4921 [MtOI2018]情侣?给我烧了! 加强版

    https://www.luogu.com.cn/problem/P4921 设f(n,k)表示从n对情侣中恰好k对情侣和谐的情况设f(n, k)表示从n对情侣中恰好k对情侣和谐的情况设f(n,k)表 ...

  2. 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题

    题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...

  3. 展翅翱翔之时 (はばたきのとき)

    展翅翱翔之时(はばたきのとき)⁡\operatorname{展翅翱翔之时 (はばたきのとき)}展翅翱翔之时(はばたきのとき) 题目链接:luogu P3651⁡\operatorname{luogu\ ...

  4. cmd窗口太炫酷了,电脑编码软件太多?手把手教你搭建Java环境,利用dos命令实现运行操作

    Java学习打卡:第十四天 内容导航 Java学习打卡:第十四天 内容管理 什么是cmd 写文背景介绍 搭建java环境 首先先下载JDK,java开发工具包 第二步:将压缩包解压到指定目录 第三步: ...

  5. 51nod 1238 最小公倍数之和 V3

    背景: luogu P1829 \text{luogu P1829 }luogu P1829 [国家集训队]Crash的数字表格 / JZPTAB的加强版. 题目传送门: http://www.51n ...

  6. 二项式反演(广义容斥定理)学习笔记

    背景: 二项式反演又名广义容斥定理. 下次再看题解时要注意了. 解锁新姿势. 说白了就是之前会的姿势太少了. 正题: 说白了就是有这样两条恒等的式子: f n = ∑ i = 0 n ( − 1 ) ...

  7. Kitty猫基因编码

    Kitty猫基因编码⁡\operatorname{Kitty猫基因编码}Kitty猫基因编码 题目链接:luogu P2562⁡\operatorname{luogu\ P2562}luogu P25 ...

  8. CSP2020-S1游记

    第一次在绍兴考 CSP-S\text{CSP-S}CSP-S 初赛,第一次写游记. Day ?∼Day -1:\text{Day ?}\sim \text{Day -1}:Day ?∼Day -1: ...

  9. Charmer--viv

    Charmer--viv⁡\operatorname{Charmer--viv}Charmer--viv 题目链接:luogu P2259⁡\operatorname{luogu\ P2259}luo ...

最新文章

  1. python scipy模块文档_scipy模块stats文档
  2. 中国企业2017年数据_根据数据,2017年最好的免费在线课程
  3. Kafka分区原理图
  4. 英语阅读测试,很神奇吧~
  5. 有php注入的源码,php注入3_php
  6. 怎样判断一个领导是否值得追随呢?
  7. 加密解密(源自Discuz!NT3.1)
  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_5_InvalidClassException异常_原理...
  9. 林轩田机器学习基石和技法资源
  10. 中国杀防论坛[ANTI-CN BBS] 新版上线
  11. java在线测试工具_9个最好用的在线编译/调试工具
  12. 怎么批量修改照片的分辨率?照片dpi怎么调?
  13. mgo EnsureIndex注意事项
  14. mysql表别名不加as_数据库别名AS区别
  15. SMD电容极性的区分
  16. 5分钟看懂│从深蓝到阿尔法狗,人机大战20年进化了什么?
  17. python压缩视频文件_python+压缩视频教程
  18. 一文带你搞定抖音最近最火的情侣微信早报信息推送
  19. 如何利用人工智能技术提高网文生产的运营效率?
  20. Efficient bipedal robots based on passive-dynamic walkers

热门文章

  1. Shell下的通配符、特殊符号和文件描述符
  2. illumina的barcode居然有那么多类型
  3. UPA均匀面阵,MIMO,LoS信道信号传播延迟时间推导
  4. 查找表(LUT,Look-up Table)的简单理解
  5. JS学习笔记 (四) 数组进阶
  6. Neo4j桌面版和py2neo冲突解决
  7. 微软的“牛头怪时刻”
  8. 【Java web】请求转发响应重定向
  9. android倾斜角标实现
  10. ZOJ 3940 Modulo Query