首页 > 其他分享 >AtCoder Grand Contest 046 F Forbidden Tournament

AtCoder Grand Contest 046 F Forbidden Tournament

时间:2024-01-16 16:23:53浏览次数:33  
标签:AtCoder typedef Contest Forbidden SCC maxn long ll define

洛谷传送门

AtCoder 传送门

太厉害了!!!!!!

首先竞赛图有个性质,若存在环则一定存在三元环。

先把 DAG 的情况(一条链)特判了。然后缩点。发现非链底的部分不能存在大小 \(> 1\) 的 SCC。所以枚举非链底的部分有多少点,转化为 SCC 的情况。

发现对于任意点(设为 \(1\) 号点),它的前驱连成一条链,后继也是一条链。

如果前驱有环那么和 \(1\) 可以形成子图。如果后继最后有一个 SCC,考虑拿出前驱的链顶 \(y\)。显然这个 SCC 的点不能全部连向 \(y\)。所以这个 SCC 能分成两个非空集合 \(S_1, S_2\),满足一个连向 \(y\),一个被 \(y\) 连。发现 \(S_1\) 不能存在到 \(S_2\) 的边。所以这不是一个 SCC。

设前驱的链为 \(A_{1 \sim a}\),后继的链为 \(B_{1 \sim b}\)。

首先因为这是一个 SCC 所以一定有 \(B_b \to A_1\) 的边。

然后我们发现对于前驱的点,它一定是有一段连向后继的前缀,剩下的后缀是连向这个点。

设前驱第 \(i\) 个点连向后继的是 \([1, p_i]\)。又发现 \(p\) 单调不降。

然后就可以转化为对于 \(p\) 计数。入度判一下即可。

时间复杂度 \(O(n^4)\)。

code
// Problem: F - Forbidden Tournament
// Contest: AtCoder - AtCoder Grand Contest 046
// URL: https://atcoder.jp/contests/agc046/tasks/agc046_f
// Memory Limit: 1024 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 210;

ll n, m, mod, fac[maxn], C[maxn][maxn], f[maxn][maxn];

inline ll calc(ll n, ll m) {
	ll ans = 0;
	for (int a = 1; a < n - 1; ++a) {
		int b = n - 1 - a;
		mems(f, 0);
		if (a > m || b > m) {
			continue;
		}
		for (int i = 0; i < b; ++i) {
			if (b - i <= m && (!i || a + i <= m)) {
				f[1][i] = 1;
			}
		}
		for (int i = 2; i <= a; ++i) {
			ll s = 0;
			for (int j = 0; j <= b; ++j) {
				s = (s + f[i - 1][j]) % mod;
				if (i - 1 + b - j <= m && (!j || j + a - i + 1 <= m)) {
					f[i][j] = s;
				}
			}
		}
		for (int i = 0; i <= b; ++i) {
			ans = (ans + fac[n - 1] * f[a][i]) % mod;
		}
	}
	return ans;
}

void solve() {
	scanf("%lld%lld%lld", &n, &m, &mod);
	fac[0] = 1;
	for (int i = 1; i <= n; ++i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	for (int i = 0; i <= n; ++i) {
		C[i][0] = C[i][i] = 1;
		for (int j = 1; j < i; ++j) {
			C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
		}
	}
	ll ans = (m == n - 1 ? fac[n] : 0);
	for (int i = 0; i <= n - 3 && i < m; ++i) {
		ans = (ans + C[n][i] * fac[i] % mod * calc(n - i, m - i)) % mod;
	}
	printf("%lld\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:AtCoder,typedef,Contest,Forbidden,SCC,maxn,long,ll,define
From: https://www.cnblogs.com/zltzlt-blog/p/17967940

相关文章

  • Atcoder Beginner Contest 330 题解
    AtCoderBeginnerContest330题解A-CountingPasses签到voidShowball(){intn,l;cin>>n>>l;intcnt=0;for(inti=0;i<n;i++){intx;cin>>x;cnt+=(x>=l);}cout<<cnt<<endl;}B-Minimize......
  • AtCoder Beginner Contest 336
    B-CTZ难度:⭐题目大意给定一个数n,输出其二进制最后有几个连续的0;解题思路模拟一下就行;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineendl'\n'usingnamespacestd;......
  • AtCoder Beginner Contest 336
    AtCoderBeginnerContest336比赛链接A-LongLoong思路:简单的模拟代码:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){intn;//cin>>n;cin>>n;cout<<"L";for(inti=......
  • AtCoder Grand Contest 051 D C4
    洛谷传送门AtCoder传送门下文的点\(1,2,3,4\)对应原题面中的\(S,T,U,V\)。直接对无向图欧拉回路计数不太好做。考虑给边定向。枚举有\(i\)条边是从\(1\)到\(2\)的。那么\(2\to1\)有\(a-i\)条边。由于这个图必须满足每个点的入度等于出度,设\(j\)条\(......
  • AtCoder Beginner Contest 336
    AtCoderBeginnerContest336A-LongLoong#include<bits/stdc++.h>#defineendl'\n'//#defineintlonglongusingnamespacestd;voidsolve(){ intx; cin>>x; cout<<"L"; while(x--)cout<<"o&q......
  • 2021-2022 ACM-ICPC Latin American Regional Programming Contest
    Preface唉最近天天前期犯病,读错题占用大量机时还红温,纯在靠队友兜底H板题但刚开始因为没打印自己的KM板子就写个了MCMF上去,然后直接TLE飞,后面找了个别人的板子抄上去才过,I题一个傻逼题题意读错爆WA两发最后1h把L题扔给队友然后跑去看ECF滚榜直播了,只能说从此清北电的格局打开了......
  • AtCoder World Tour 2022 B The Greatest Two
    原题面:https://atcoder.jp/contests/wtf22-day2/tasks/wtf22_day2_b题面翻译:一个长度为\(n\)的排列\(p\),每次可以把一个长\(k\)区间的最大与次大值交换,问操作任意次数后可以得到的排列数量对\(998244353\)取模。这题被我搬到了一场多校联考中。在搬到的题面中,我加入了......
  • 2021-2022 ICPC Northwestern European Regional Programming Contest (NWERC 2021)
    Preface和昨天刚好相反,前期极度崩盘2h2题而且一堆银铜牌题不会但好在后面稳扎稳打慢慢追回来了一点,最后超高罚时8题收场这场一边打一边看ECF的实况,最后看到同校的Wifi暴打全场,实在是ORZA.AccessDenied签到,首先暴力问出长度然后从前往后一位一位确定即可注意实现的时候不......
  • AtCoder Beginner Contest 335 G Discrete Logarithm Problems
    洛谷传送门AtCoder传送门考虑若我们对于每个\(a_i\)求出来了使得\(g^{b_i}\equiva_i\pmodP\)的\(b_i\)(其中\(g\)为\(P\)的原根),那么\(a_i^k\equiva_j\pmodP\)等价于\(kb_i\equivb_j\pmod{P-1}\),有解的充要条件是\(\gcd(b_i,P-1)\midb_j\)。显然......
  • AtCoder Beginner Contest 335 (Sponsored by Mynavi)
    AtCoderBeginnerContest335(SponsoredbyMynavi)A-2023代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondvoidsolve(){strings;cin>>s;......