【Luogu4921】情侣?给我烧了!(组合计数)
【Luogu4921】情侣?给我烧了!(组合计数)
题面
洛谷
题解
很有意思的一道题目。
直接容斥?怎么样都要一个平方复杂度了。
既然是恰好\(k\)对,那么我们直接来做:
首先枚举\(k\)对人出来\(\displaystyle {n\choose k}\),然后枚\(k\)排座位出来\(\displaystyle {n\choose k}\),这些人间的顺序关系\(k!\),然后这些人可以左右交换\(2^{k}\)。
好的,现在的问题转化为了剩下\(n-k\)对人,两两之间不能坐在一排,求方案数。
首先这\(n-k\)对人的顺序提前算好\((n-k)!\),然后左右顺序忽视掉\(2^{n-k}\)。
假装\(n\)对人完全错开的方案数是\(f(n)\)。
类似错排问题,然而并不是错排问题。类似错排问题的递推公式的想法,每次加入最新的一组。
那么当前这一组随便和前面哪一排找个人互换就好了,一共有两种交换方法。所以这一部分的贡献是\((n-1)*2*2*2*f(n-1)\)。
还有特殊情况就是原本换的那组两个人在一排,现在和这一排强制交换,有两种交换方法。那么这部分的贡献就是\((n-1)*2*f(n-2)\)。
那么转移凑合一下就是\(f(n)=2(n-1)(f(n-1)+f(n-2))\)。
再把答案式写一下:
\[Ans_k=2^n{n\choose k}^2k!(n-k)!f(n-k)\]
这样子预处理\(f\)之后单次的复杂度为\(O(n)\)。
不过我还看到了一种很有意思的方法。
设\(f[i][j]\)表示\(i\)对情侣中恰好有\(j\)对坐在一起的方案数,\(g[i]\)表示\(i\)对情侣都不坐在一起的方案数。
那么\(\displaystyle f[n][k]={n\choose k} A_n^k2^k*g[n-k]\)
那么反过来\(\displaystyle g[n]=(2n)!-\sum_{i=1}^n f[n][i]\)
这样子是\(O(n^2)\)的,感觉很有意思的方法。
代码是前面那种方法
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 1010
#define MOD 998244353
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,f[MAX],jc[MAX],jv[MAX],inv[MAX],bin[MAX];
int C(int n,int m){return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
int main()
{int T=read();jc[0]=jv[0]=inv[0]=inv[1]=f[0]=bin[0]=1;for(int i=1;i<MAX;++i)f[i]=2ll*(i-1)*(f[i-1]+f[i-2])%MOD;for(int i=2;i<MAX;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;for(int i=1;i<MAX;++i)jc[i]=1ll*jc[i-1]*i%MOD;for(int i=1;i<MAX;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;for(int i=1;i<MAX;++i)bin[i]=2ll*bin[i-1]%MOD;while(T--){n=read();for(int i=0;i<=n;++i)printf("%lld\n",1ll*bin[n]*C(n,i)%MOD*C(n,i)%MOD*jc[n-i]%MOD*jc[i]%MOD*f[n-i]%MOD);}return 0;
}
```
转载于:https://www.cnblogs.com/cjyyb/p/10176689.html
【Luogu4921】情侣?给我烧了!(组合计数)相关推荐
- 解题报告(五)组合计数(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 解题报告(二)E、(BZOJ3513) [MUTC2013] idiots(生成函数 + FFT + 组合计数)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- CF1237F Balanced Domino Placements(组合计数,dp)
CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌,再考虑竖着的骨牌.但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响. 然而 ...
- 1307 牡牛和牝牛(组合计数-递推)
1. 问题描述: 约翰要带 N 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排,但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有 K 只牝牛.请计算 ...
- 学组合数学心得与题解(一)——组合计数
今天我在某网站上稍微学习了一下组合数学,准确来讲,今天就看了看组合计数.像一些弱智的排列数.组合数大家肯定在小学奥数就已经精通了(只有我这种蒟蒻忘的精光).当然,博主比较菜,连二项式定理.帕斯卡恒等式 ...
- 基础组合计数常用的概念和方法总结
基础组合计数常用的概念和方法总结 一.组合计数中的基本概念与性质 1.排列 定义 性质 2.组合 定义 性质 二.组合计数中的一些常用技巧 1.容斥原理 定义 公式 2.捆绑与插空法 捆绑法 插空法 ...
- 数学知识——组合计数
组合计数 文章目录 组合计数 概述 动态规划 牡牛和牝牛 思路 代码 隔板法 方程的解 思路 代码 序列统计 思路 代码 加法 & 乘法原理 加法原理 乘法原理 车的摆放 思路 代码 容斥原理 ...
- CodeForces 997C-Sky Full of Stars〖容斥定理+组合计数〗
网页链接:传送门 C. Sky Full of Stars time limit per test : 4 seconds memory limit per test : 256 megabytes ...
- 1308 方程的解(组合计数--隔板法)
1. 问题描述: 佳佳碰到了一个难题,请你来帮忙解决.对于不定方程 a1+a2+⋯+ak−1+ak=g(x),其中 k ≥ 1 且 k∈N∗,x 是正整数,g(x)=x ^ x mod 1000(即 ...
最新文章
- 合并的路径Path.Combine
- win2003服务器记录文件夹,在Windows Server 2003里快速查找文件
- boost::movelib::default_delete相关用法的测试程序
- 空间谱专题16:间距选取分析
- JavWeb笔记:JavaScript总结
- STM32工作笔记0083---UCOSIII中断和时间管理
- bzoj 2528: [Poi2011]Periodicity【kmp+构造】
- Nginx 日志配置实践
- 2017《JAVA》预备作业 计科1501班 王奕开
- Linux 系统批量安装字体的方法
- dsp+c语言字符串,DSP中常用的C语言关键字
- mysql登录框万能密码_网站登录万能密码
- 两个路由器的有线桥接与无线桥接
- (转)loff_t *ppos是什么东东
- python之pandas基础知识以及练习题
- 微信收钱的盒子服务器老是断开,微信文件已过期或被清理的终极解决办法
- 自然语言三兄弟NLP、NLU、NLG傻傻分不清?一文搞懂它们的区别
- gamc网卡驱动2-----gmac收发实现
- 蚂蚁调度AntJob-分布式任务调度系统
- 重生之我是赏金猎人-漏洞挖掘(十一)-某SRC储存XSS多次BypassWAF挖掘
热门文章
- java的编程规范_JAVA编程规范-OOP规范
- html JS实现下拉菜单,vue.js怎么实现下拉框
- python自动化测试流程_接口自动化基本流程(python)
- [Python] 中英文标点转换
- 分区助手找不到盘_C盘的概述与分区
- java基础之 反射_Java基础之反射原理与用法详解
- java中的枚举_Java中的枚举
- Node JS和MongoDB的集成简单示例
- [已解决] org.hibernate.HibernateException:没有活动事务,get无效
- Vuex源码阅读分析