首页 > 其他分享 >AGC068A 做题记录

AGC068A 做题记录

时间:2024-10-07 21:34:19浏览次数:1  
标签:基准点 ch 记录 ll 一段 白点 AGC068A define

很好的组合数学题。

考虑以任意一个点为基准计算方案数,最终答案乘上 \(\dfrac L n\) 即可。

枚举点两两之间最短路径 \(\le d\),计算方案数,剩下的 \(n - 1\) 个点都应该至多在基准点的左 \(d\) 个和右 \(d\) 个点的位置。

显然左右 \(d\) 个位置内部的距离都不超过 \(d\),只需要判定两边结合起来是否合法。

考虑选择了左边的一个点,右边就会有一段点不能选;右边同理。一个神奇的方法:把左边的点旋转到限制的一段点的第一个位置,并视为黑点,右边的点视为白点。那么条件相当于:所有点不重合,并且黑点后面固定长度的一段点不能选白点,白点前面固定长度的一段点不能选黑点。

令基准点为白点。枚举黑转白的次数 \(i\),设不能选的一段点长度为 \(t\),那么选点的方案数为 \(\dbinom {d - i\cdot t} {n - 1}\)。再考虑黑白染色,相当于分成 \(2(i + 1)\) 段,除了第一段和最后一段,其他段非空的方案数,插板法得出方案数为 \(\dbinom {n} {2i + 1}\)。

所有 \(i\) 的总和为调和级数级别的,可以通过。

  • 启示:基准点 trick;调整模型,观察组合方案。
点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define mkp make_pair
#define pir pair <ll, ll>
#define pb emplace_back
#define i128 __int128
using namespace std;
const ll maxn = 2e6 + 10, mod = 998244353;
void rd(ll &x) {
	char ch;
	while(!isdigit(ch = getchar())) ;
	x = ch - '0';
	while(isdigit(ch = getchar()))
		x = (x << 1) + (x << 3) + ch - '0';
} ll n, m, c[maxn], ans, fac[maxn], ifac[maxn];
ll power(ll a, ll b = mod - 2) {
	ll s = 1;
	while(b) {
		if(b & 1) s = s * a %mod;
		a = a * a %mod, b >>= 1;
	} return s;
}
ll C(ll a, ll b) { return a < b || b < 0? 0 : fac[a] * ifac[b] %mod * ifac[a - b] %mod; }
int main() {
	rd(m), rd(n);
	fac[0] = 1;
	for(ll i = 1; i <= n + m; i++) fac[i] = fac[i - 1] * i %mod;
	ifac[n + m] = power(fac[n + m]);
	for(ll i = n + m; i; i--) ifac[i - 1] = ifac[i] * i %mod;
	for(ll d = 1; 2 * d <= m; d++) {
		ll t = m - 2 * d - 1;
		if(t <= 0) c[d] = C(m - 1, n - 1);
		else
		for(ll i = 0; i * t <= d; i++)
			c[d] = (c[d] + C(d - i * (t - 1), n - 1) *
			            C(n, 2 * i + 1)) %mod;
		ans = (ans + (c[d] + mod - c[d - 1]) * d) %mod;
	} printf("%lld", ans * m %mod * power(n) %mod);
	return 0;
}

标签:基准点,ch,记录,ll,一段,白点,AGC068A,define
From: https://www.cnblogs.com/Sktn0089/p/18450673

相关文章

  • 2024.10.05 刷题记录
    2024.10.05刷题记录P7597「EZEC-8」猜树加强版不难发现\(u\)的儿子的条件是在\(u\)的子树内且深度比\(u\)恰好大\(1\)。每次询问子树内的所有节点深度或许可以解决此题,但询问次数达到了\(n^2\)。在\(u\)的子树内,如果知道所属其他儿子的子树的节点,知道属于\(u\)......
  • 【训练记录】山东济南齐鲁工业大学ACM集训队第二次入队赛同步赛(场外VP)
    https://icpc.qlu.edu.cn/contest/66ed8b746002253a77c10d5e训练情况场外rk#2AK赛后反思A题太菜了,没看出来是01背包DP,往前缀和上面想了,写了个假做法。B题又不认真看题,忘记了\(=0\)的情况。C题博弈论乱猜D题未考虑完全导致一次WAA题分两组,两组和相同,观察数据范围我们......
  • 2024CCPC山东省赛补题记录
    前言今天和队友VP了24CCPC山东省赛,最后9题,但是赛中7题左右我就隐身了,赛后看题解发现E题不难,赛时过的人太少导致有点畏手畏脚,看到题解一下就懂了,几分钟写好。这里主要补一下E和L的题解,这场比赛学到了维护区间信息,可以考虑把区间挂在线段树节点上,以及动态维护树直径的典。E传感器......
  • 团队训练记录2024.10.7
    赛时依然和本校强队差两题比赛链接:https://codeforces.com/gym/104901A.ManyManyHeads这里先用栈处理好第一个状况,然后根据层数进行第二个状况是否存在判断#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;llgcd(llx,lly){if(y==0)retu......
  • 2024 Noip 做题记录(四)
    \(\text{ByDaiRuiChen007}\)Round#13-2024.10.1A.[ARC165D]CompareProblemLink题目大意判断是否存在一个长度为\(n\)的字符串\(S\),满足\(m\)个限制\((a,b,c,d)\),要求\(S[a,b]\)字典序小于\(S[c,d]\)。数据范围:\(n,m\le2000\)。思路分析从一些必要条......
  • 2024.10.6训练记录
    下午cfA到!B签到题,考场还是写挂了,今天码力差。挂在while动指针的时候没有判右边界,似。唐诗程度不亚于数组开小。C1猜出来结论是第一次出现需要按照一开始的顺序就能过。C2把一开始的排列映射到[1,n]。修改时用set动态维护每个数第一次出现的位置。把第一次出现位置的......
  • 2024.10 做题记录 /
    CF2004E套用SG函数的结论,我们先打单个游戏的表再异或即可得到答案。首先对于一个大小为\(i\)的堆有\(SG[i]=\text{mex}_{j\boti}\{SG[i-j]\}\),容易暴力dp。intSG[N];intf(intx){ if(SG[x]!=-1)returnSG[x]; if(x==0)returnSG[0]=0; vector<int>g; up(i,1,x......
  • 【CodeForces训练记录】Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final
    赛后反思做红温了,太菜了,每题都需要WA几次才能过,B题看到MEX选择性害怕,时间复杂度又算错了A题每次选择一对\(a_i,a_j\)把均值插入数组最后面,要想结果最大,对于两个数求均值,最后的结果一定是小于等于其中的较大值,我们可以考虑如何最大化最后一次操作,想到将最大值保留在最后再......
  • java性能调优记录
    五、设计模式调优单例模式最简单的单例模式及问题分析//懒汉模式publicfinalclassSingleton{privatestaticSingletoninstance=null;//不实例化privateSingleton(){if(instance!=null){thrownewRuntimeException("UsegetInstance()methodtoge......
  • Nodered学习记录-MQTT
    安装EMQXEMQX(以前称为EMQ)是一个开源的、高度可扩展且高可用的分布式MQTT消息代理,专为物联网(IoT)、机器对机器(M2M)通信和移动应用程序设计。它支持MQTT和其他IoT协议如CoAP/LwM2M,能够处理数百万并发连接,并提供强大的消息路由能力。通过docker安装官方文档$dockerpullem......