首页 > 其他分享 >T392582 我有抑郁症【题解】

T392582 我有抑郁症【题解】

时间:2023-11-04 15:24:45浏览次数:33  
标签:int 题解 ll Inv 抑郁症 ans T392582 binom Mod

题目描述

要求有多少个序列满足:

  • 令 \(v=1\sim n\)
  • 从 \(v\) 号点开始,走到 \(p_v\),…,最后走回 \(v\)
  • 记录每个点被走到的次数(起点算,终点不算,反正只算一次)
  • \(i\) 号点走到的次数恰好是 \(i\)

答案对 \(998,244,353\) 取模

Solution

首先,一个点有一个出边,这个图为什么一定可以走回来?

因为这是个排列啊!不能有相同的入边,每个点只有一个出边,这是什么!这是环啊!

所以整个图就是若干个环,我们要在环上计数。

设我们当前的 \(a_i\) 统称为 \(k\),\(a_i=k\) 的点数量是 \(c_k\),则这个图有答案当且仅当 \(k | c_k\),为什么?

因为一个环上 \(a_i=k\),那么这个环只有 \(k\) 个点,\(a_i=k\) 的图有可能会有很多个由 \(k\) 个点组成的环,所以必须要 \(k\) 能被 \(c_k\) 整除

首先考虑这个图上有 \(\cfrac{c_k}{k}\) 个环,为了好描述,我们令 \(\cfrac{c_k}{k}=S\),那么我们先从大的角度入手,即分给每个环多少个元素

那肯定是从 \(c_k\) 个点选 \(k\) 个了,然后再从剩下 \(c_k-k\) 个点选 \(k\) 个,以此类推,即贡献为

\[\cfrac{\binom{c_k}{k}\binom{c_k-k}{k} …\binom{k}{k}}{S!} \]

然后在考虑每个环里的贡献,即有多少种不同的环可以符合条件

我一开始想 \(1\) 号点不能在第一个,好难搞啊

但是后面大佬们告诉我,不要考虑细节,直接构造一个环就完事了,想想也确实是这样

因为你这个序列肯定是个环,因为具体在 \(1\) 号点填的是这条出边的终点,所以相当于求本质不同的环的个数!!!

所以就是圆排列,也就是 \((k-1)!\) 了,然后有 \(S\) 组,相乘就好了

也就是贡献是:

\[\cfrac{\binom{c_k}{k}\binom{c_k-k}{k} …\binom{k}{k}}{S!} \times (k-1)!^{S} \]

做完了,以下是代码

#include <bits/stdc++.h>

using namespace std;

int T;

const int MAXN = 5e5 + 7;

typedef long long ll;

const ll Mod = 998244353;

ll Fac[MAXN], Inv[MAXN];

int n; 

ll qpow(ll a, ll b) {
	ll ans = 1;
	while (b) {
		if (b & 1) ans = ans * a % Mod;
		a = a * a % Mod, b >>= 1;
	}
	return ans;
}

int A[MAXN];

ll ans = 1;

ll C(int n, int m) { return Fac[n] * Inv[m] % Mod * Inv[n - m] % Mod; }

int main () {
	ios :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	
	cin >> T;
	
	Fac[0] = 1;
	for (int i = 1; i <= 500000; i ++) Fac[i] = Fac[i - 1] * i % Mod;
	Inv[500000] = qpow(Fac[500000], Mod - 2);
	for (int i = 500000 - 1; i >= 0; i --) Inv[i] = Inv[i + 1] * (i + 1) % Mod;
	
	while (T --) {
		cin >> n; memset(A, 0, sizeof(A)); ans = 1;
		for (int i = 1, x; i <= n; i ++) cin >> x, A[x] ++;
		for (int i = 2; i <= n; i ++) {
			if (A[i] % i && A[i]) ans = 0;
			else if (A[i]){
				for (int j = 0; A[i] - j * i > 0; j ++) ans = ans * C(A[i] - i * j, i) % Mod;
				ans = ans * Inv[A[i] / i] % Mod * qpow(Fac[i - 1], (A[i] / i)) % Mod;	
			}
		}
		cout << ans << '\n';
	} 
	return 0;
}

完结撒花✿✿ヽ(°▽°)ノ✿

标签:int,题解,ll,Inv,抑郁症,ans,T392582,binom,Mod
From: https://www.cnblogs.com/Phrvth/p/17809378.html

相关文章

  • 【洛谷 P1085】[NOIP2004 普及组] 不高兴的津津 题解(打擂台法)
    [NOIP2004普及组]不高兴的津津题目描述津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因......
  • [题解]AT_abc222_f [ABC222F] Expensive Expense
    板子题,模拟赛场切了。思路线段树换根板子题。因为需要求每一个点的答案,所以定义\(dp_i\)表示以\(i\)为根的最长距离。考虑将一个点\(v\)转化为根,树的形态会发生什么变化(假设\(v\)的父亲节点是\(u\))。发现在\(v\)子树中的节点,距离都会减少\(w_{u\tov}\),其它节点......
  • 跨域问题解决办法
    跨域问题及解决#xss:跨站脚本攻击,cors:跨域资源共享,csrf:跨站请求伪造#1同源策略:请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.#2CORS:跨域资源共享,允许不同的域来我的服务器拿数据#3CORS请求分成两类:简单请求(simplerequest)和非简单请求(no......
  • CF1866D Digital Wallet 题解
    Problem-1866D-CodeforcesDigitalWallet-洛谷不妨为选数钦定一个顺序:不同行之间无影响,列从左到右取一定不劣。设计状态:设\(dp_{i,j}\)表示前\(i\)次操作操作到第\(j\)列的最大答案转移:因为对于同一列不互相影响,因此枚举这一列取\(c\)个数,显然取这一列数......
  • 数据库问题解析
    1、表连接表连接(JOIN)是在多个表中间通过⼀定的连接条件,使表之间发⽣关联进⽽能从多个表之间获取数据。2、3、表联合union:对两个结果集进⾏并集操作,不包括重复⾏unionall:对两个结果集进⾏并集操作,包括重复⾏注意事项:①每条SELECT语句必须拥有相同数量的列;②每条SELE......
  • P9817 题解
    这里提供一个非常暴力但是期望复杂度很低的算法。不难想到要么就是全部放\(1\),要么就是取出一个最大的质数,然后对于剩下的部分继续按照这样的策略求答案。因为质数间隔不大,然后暴力判断质数复杂度是\(O(\sqrtn)\)的,再加上IOI的buff,我们可以直接考虑从大到小枚举质数,因为......
  • [ARC104F] Visibility Sequence 题解
    题意对于一个长度为\(N\)的序列\(H\),可以通过如下方式构造一个序列\(P\):若存在\(j\in\left[1,i\right)\),使得\(H_j>H_i\),则\(P_i=\max\limits_{j\in\left[1,i\right)\landH_j>H_i}j\),否则\(P_i=-1\)。给定一个长度为\(N\)的序列\(X\),求所有满足如......
  • CF1866M Mighty Rock Tower 题解
    Problem-1866M-CodeforcesMightyRockTower-洛谷先考虑一个\(O(n^2)\)的dp设计状态:\(dp_i\)表示搭\(i\)层的期望转移:\(dp_i=dp_{i-1}\times(1-P_i)+\sum\limits_{j=i}^{n-1}dp_j\timesP_{j+1}^{j-i+1}\times(1-P_{j+1})\),显然是有后效性的,但我们展开......
  • [ARC104E] Random LIS 题解
    题意给定一个长度为\(N\)的序列\(A\),按照下列方式生成一个长度为\(N\)的序列\(X\):\(\foralli\in[1,n]\),\(X_i\)在\([1,A_i]\)中的整数中均匀随机生成。求其最长上升子序列长度的期望,对\(10^9+7\)取模。\(1\leN\le6,1\leA_i\le10^9\)。题解由于\(N\)......
  • CSP-S2023 全场题解
    lock这题就是个模拟吧,赛时被迷惑了以为是什么不可做题,仔细看只有\(10^5\)种状态,那就枚举好了。我们分别从状态串出发,枚举它能达到的答案,加到set取个并集,不过注意给定的状态不能是密码,要减掉。注意不要直接计数器减减,不然如果有相同的算在状态里面的会多减,我考场代码就这么被......