XMOJ 四月月赛 T3 旅行 题解
我们首先尝试挖掘这个分组的性质。
我们发现,我们可以把在同一个组的夫妻和不在同一个组的夫妻分开来处理。
这里,分开之后我们只需要让一种情况有顺序,另外一种不能有顺序。如果两个没有顺序 / 有顺序的序列合并,一定会出现漏算 / 多算。
所以为了方便,我们可以把第二种情况看作有顺序。
思考:为什么不能把第一种情况看作有顺序呢?
首先假设总共有 \(i\) 组,这里 \(i\) 是我们枚举的数。
\(\text{Situation 1}\):同一个组的夫妻情况数
假设有 \(x\) 组这种夫妻。
我们需要把这 \(x\) 组夫妻划分进不同的组别里,组内没有顺序,组外也没有顺序。
抽象化一下,我们需要把 \(x\) 个互不相同的数分组,组内、组外均没有顺序。
仔细思考,这不是第二类斯特林数吗?直接 \(f_{i, j} = f_{i - 1, j - 1} + j \times f_{i - 1, j}\) 实现 \(\mathcal{O}(n^2)\) 递推即可。
\(\text{Situation 2}\):不同组的夫妻情况数
这非常容易。
由于我们固定了这种情况有顺序,所以我们完全可以对每一个夫妻单独划分组别。每一个夫妻的方案数为 \(i \times (i - 1)\),即总方案数为 \(p_{i, x}
= (i(i - 1))^x\)。
接下来合体。
在预处理完前两个的情况后,我们首先枚举 \(i\) 表示整体的组别数量。
接着,我们枚举分在同一组的夫妻 \(j\)。于是,\(n - j\) 对夫妻不在同一组。这样的方案数显然是 \(\binom{n}{j}\)。
再结合开头的结论,我们得出答案:
\]
感觉非常的数学。值得记录。
/*******************************
| Author: DE_aemmprty
| Problem: Nastya and Unexpected Guest
| Contest: Luogu
| URL: https://www.luogu.com.cn/problem/CF1340C
| When: 2024-05-05 21:48:42
|
| Memory: 250 MB
| Time: 1000 ms
*******************************/
#include <bits/stdc++.h>
using namespace std;
long long read() {
char c = getchar();
long long x = 0, p = 1;
while ((c < '0' || c > '9') && c != '-') c = getchar();
if (c == '-') p = -1, c = getchar();
while (c >= '0' && c <= '9')
x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * p;
}
const int N = 607;
const long long mod = 1e9 + 7;
int n;
long long f[N][N];
long long p[N][N];
long long fac[N];
long long ksm(long long x, long long y) {
long long res = 1;
for (; y; y >>= 1, (x *= x) %= mod)
if (y & 1)
(res *= x) %= mod;
return res;
}
long long C(long long x, long long y) {
return (x < y ? 0 : fac[x] * ksm(fac[y] * fac[x - y] % mod, mod - 2) % mod);
}
void solve() {
n = read();
f[0][0] = fac[0] = 1;
for (int i = 1; i <= n; i ++)
fac[i] = fac[i - 1] * i % mod;
for (int i = 1; i <= n; i ++)
for (int j = 0; j <= i; j ++)
f[i][j] = (f[i - 1][j - 1] + j * f[i - 1][j] % mod) % mod;
for (int i = 1; i <= n; i ++)
for (int j = 0; j <= n; j ++)
p[i][j] = ksm(i * (i - 1) % mod, j) % mod;
long long ans = 0;
for (int i = 1; i <= n; i ++) for (int j = 1; j <= i; j ++)
(ans += C(n, i) * f[i][j] % mod * p[j][n - i] % mod) %= mod;
cout << ans;
}
signed main() {
freopen("trip.in", "r", stdin);
freopen("trip.out", "w", stdout);
int t = 1;
while (t --) solve();
return 0;
}
XMOJ 四月月赛 T3 旅行 题解的更多相关文章
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行
[NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...
- noip2012开车旅行 题解
题目大意: 给出n个排成一行的城市,每个城市有一个不同的海拔.定义两个城市间的距离等于他们的高度差的绝对值,且绝对值相等的时候海拔低的距离近.有两个人轮流开车,从左往右走.A每次都选最近的,B每次都选 ...
- 洛谷2019 3月月赛 T3
题干 唯一AC T3 的大巨佬%%% 这题就是个大模拟吧. 题解
- 洛谷 P5022 旅行——题解
发现大部分题解都是O(n^2)的复杂度,这里分享一个O(n)复杂度的方法. 题目传送 首先前60%的情况,图是一棵无根树,只要从1开始DFS,每次贪心走点的编号最小的点就行了.(为什么?因为当走到一个 ...
- ZOJ Monthly, June 2014 月赛BCDEFGH题题解
比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...
- usaco 2002 月赛 Fiber Communications 题解
Description Farmer John wants to connect his N (1 <= N <= 1,000) barns (numbered 1..N) with a ...
- [HAOI2006]旅行 题解(kruskal)
[HAOI2006]旅行 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,-,N),这些景点被M条道路连接着,所有道路都 ...
- luogu11月月赛T3咕咕咕(组合数学)
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)
[CodePlus 2017 11月赛]晨跑 Description "无体育,不清华"."每天锻炼一小时,健康工作五十年,幸福生活一辈子".在清华,体育运动绝 ...
- NOIP 2018旅行题解
从佳木斯回来刷一刷去年没A的题 题目描述 小 Y 是一个爱好旅行的 OIer.她来到 X 国,打算将各个城市都玩一遍. 小Y了解到, X国的 nn 个城市之间有 mm 条双向道路.每条双向道路连接两个 ...
随机推荐
- RBMQ案例二:工作队列模式
工作队列模式 工作队列(又名:任务队列)背后的主要思想是避免立即执行资源密集型任务而不得不等待它完成.相反,我们安排任务稍后完成.我们将任务封装 为消息并将其发送到队列.在后台运行的工作进程将弹出任务 ...
- Spring IoC容器添加组件的方式
小编在博文<Spring Bean是什么>中介绍了Bean的基本概念,这里详细地介绍如何注册bean. 1.包扫描@ComponentScan+组件标注注解 适用场景:可以通过该方 ...
- 垃圾qt,毁我青春
一.前言说明 在软件开发的漫漫征途中,我与 Qt 的邂逅本以为是一场美妙的合作,然而,现实却给了我沉重的一击."垃圾 qt,毁我青春",这句看似过激的话语,实则饱含了我在 Qt 开 ...
- js加密手机号码中间四位方法
一.实现效果: 二.方法代码封装: 方法一: //encryptPhoneNumber.ts /** * 加密手机号码中间四位 * @param phone 手机号 * @returns { stri ...
- HarmonyOS运动开发:如何选择并上传运动记录
##鸿蒙核心技术##运动开发##Core File Kit(文件基础服务) 前言 在运动类应用中,能够快速导入和分析其他应用的运动记录是一个极具吸引力的功能.这不仅为用户提供便利,还能增强应用的实用性 ...
- helm常用操作整理
说明 下面是整理的日常常用的一些helm操作,后面会持续更新 下载chart到本地 helm repo add bitnami https://charts.bitnami.com/bitnami # ...
- AI答案之书解来为你解决难题
本文由 ChatMoney团队出品 介绍说明 "答案之书智能体"是您贴心的智慧伙伴,随时准备为您解答生活中的种种困惑.无论您在工作中遭遇瓶颈,还是在情感世界里迷失方向,亦或是对个人 ...
- 一文详解如何在 ChengYing 中通过产品线部署一键提升效率
在之前的内容当中,我们为大家介绍过 ChengYing的安装原理.产品包制作等内容,本篇就延续之前的内容,和大家展开聊聊 ChengYing 产品线部署相关的设计.帮助对「一站式全自动化全生命周期大数 ...
- 袋鼠云数栈UI5.0体验升级背后的故事:可用性原则与交互升级
最近,我们袋鼠云的UED部⻔小伙伴们,不声不响地⼲了⼀件⼤事--升级了全新设计语言「数栈UI5.0」. 众所周知,用户在使用产品时,是一个动态的过程,用户和产品之间进行交互的可用性,能否让用户愉悦.快 ...
- 终于有人把不同标签的加工内容与落库讲明白了丨DTVision分析洞察篇
上一篇文章详细给大家介绍了标签的设计与加工,在标签生命周期流程中,标签体系设计完成后,便进入标签加工与上线运行阶段,一般来说数据开发团队会主导此过程,但我们需要关心以下几个问题: ·标签如何快速创建和 ...