我们首先尝试挖掘这个分组的性质。

我们发现,我们可以把在同一个组的夫妻和不在同一个组的夫妻分开来处理。

这里,分开之后我们只需要让一种情况有顺序,另外一种不能有顺序。如果两个没有顺序 / 有顺序的序列合并,一定会出现漏算 / 多算。

所以为了方便,我们可以把第二种情况看作有顺序。

思考:为什么不能把第一种情况看作有顺序呢?

首先假设总共有 \(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}\)。

再结合开头的结论,我们得出答案:

\[\sum_{i = 1}^n \sum_{j = 1}^i \binom{n}{j} \times f_{i, j} \times p_{i,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 旅行 题解的更多相关文章

  1. 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行

    [NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...

  2. noip2012开车旅行 题解

    题目大意: 给出n个排成一行的城市,每个城市有一个不同的海拔.定义两个城市间的距离等于他们的高度差的绝对值,且绝对值相等的时候海拔低的距离近.有两个人轮流开车,从左往右走.A每次都选最近的,B每次都选 ...

  3. 洛谷2019 3月月赛 T3

    题干 唯一AC T3 的大巨佬%%% 这题就是个大模拟吧. 题解

  4. 洛谷 P5022 旅行——题解

    发现大部分题解都是O(n^2)的复杂度,这里分享一个O(n)复杂度的方法. 题目传送 首先前60%的情况,图是一棵无根树,只要从1开始DFS,每次贪心走点的编号最小的点就行了.(为什么?因为当走到一个 ...

  5. ZOJ Monthly, June 2014 月赛BCDEFGH题题解

    比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...

  6. usaco 2002 月赛 Fiber Communications 题解

    Description Farmer John wants to connect his N (1 <= N <= 1,000) barns (numbered 1..N) with a ...

  7. [HAOI2006]旅行 题解(kruskal)

    [HAOI2006]旅行 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,-,N),这些景点被M条道路连接着,所有道路都 ...

  8. luogu11月月赛T3咕咕咕(组合数学)

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  9. [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)

    [CodePlus 2017 11月赛]晨跑 Description "无体育,不清华"."每天锻炼一小时,健康工作五十年,幸福生活一辈子".在清华,体育运动绝 ...

  10. NOIP 2018旅行题解

    从佳木斯回来刷一刷去年没A的题 题目描述 小 Y 是一个爱好旅行的 OIer.她来到 X 国,打算将各个城市都玩一遍. 小Y了解到, X国的 nn 个城市之间有 mm 条双向道路.每条双向道路连接两个 ...

随机推荐

  1. 设计模式之“外观模式(门面模式)(Facade)”

    一.外观模式 1.概念 为子系统中的一组接口提供一个一致的界面 此模式定义了一个高层接口 这个接口使得这一子系统更加容易使用 他完美的体现了依赖倒转原则和迪米特法则的思想,是常用模式之一 2.何时使用 ...

  2. python开发Streamable HTTP MCP应用

    一.概述 使用python开发,最好的框架是fastmcp,github连接:https://github.com/jlowin/fastmcp 2025 年 5 月 9 日,fastmcp发布v2. ...

  3. Ubuntu 16.04 系统(解释器为 python3.12)在Pycharm虚拟环境中安装 pyspider 爬虫工具

    一:安装步骤步骤1. 系统Terminal命令行执行如下命令安装依赖的组件 PhantomJS $ wget https://bitbucket.org/ariya/phantomjs/downloa ...

  4. .NET 8 开发的跨平台多商户第三方支付SDK

    前言 快速发展的互联网应用开发中,支付功能已成为各类平台不可或缺的一环.为了帮助大家更高效地接入主流支付渠道,推荐一套基于 .NET 开发的第三方支付 SDK.该 SDK 支持跨平台运行,适用于多种操 ...

  5. WinDbg 分析 .NET Dump 线程锁问题

    在定位 .NET 应用程序中的高 CPU 占用问题时,WinDbg 是非常强大的工具之一,尤其配合 SOS 扩展使用可以快速锁定"忙线程"或死锁等问题. 本文将基于一次实际的分析流 ...

  6. 注解@Transactional事务失效的常见场景

    在<Spring Boot事务管理>中,小编介绍了注解@Transactional的基本属性和使用方法,这里介绍事务失效的八种场景,使大家对注解@Transactional有一个更深刻的认 ...

  7. K8s新手系列之指定Pod调度到指定节点上

    概述 在 Kubernetes 中,Pod的调度是通过kube-schedule来实现的,Pod的调度会经过一系列算法来进行完成. 在实际生产过程中,我们想让Pod调度到我们想要的节点上,往往通过ku ...

  8. java客户端发送socket消息到指定服务并接收响应

    做个笔记 /** * 发送socket到指定服务 * 接收有6位报文头长度的响应,支持读取分包 * * @param host IP * @param port 端口 * @param msg 消息内 ...

  9. 宝塔面板部署java springboot项目

    前言 1.此文章用的是腾讯云的云服务器,2H4G,centos7.6,宝塔面板7.9.0 2.安装好宝塔面板,这一过程就不说了,懂得都懂 3.以下准备工作仅为MyAuth需要,如果您的springbo ...

  10. K8S的API Server认证介绍

    一.说明 kube-apiserver是k8s最重要的制组件之一,主要提供以下功能: 提供集群管理的REST API 接口, 包括认证授权.数据校验以及集群状态变更等 k8s 中所有模块与 etcd ...