首页 > 其他分享 >纪念逝去的 40pts

纪念逝去的 40pts

时间:2024-11-28 14:34:56浏览次数:4  
标签:long return int 纪念 dfs 逝去 ans 40pts mod

提供一种好想的优化方法。先拿出柿子(这里的 dfs(n, k) 相当于题解的 \({n \choose k} - z(n, k)\)):

int dfs(int n, int k) {
	if (n == k) return 0;
	if (n == 1) return 0;
	if (k == 1) return 0;
	if (~f[n][k]) return f[n][k];
	return f[n][k] = (dfs(n - 1, k) + dfs(n - 1, k - 1) + (n - k + 1 <= k)) % mod;
}

每次答案是 C(n, k) - dfs(n, k)。考虑一个 \((i, j)\) 数对对答案的贡献,只有在 \(i \neq 1, j \neq 1, i \neq j, i - j + 1 \leq j\) 时,它会贡献 \(1\),并依次往上记录到答案中。这个东西和组合数的递推方式非常像,此时 dfs(n, k) 计算中就会包含 \(n - i \choose k - j\) 个 \((i, j)\) 数对,这就是它的贡献。

for (int i = 2; i <= n; i++)
	for (int j = max(k - n + i, i + 2 >> 1); j <= min(i - 1, k); j++)
		(ans += C(n - i, k - j)) %= mod; // k - n + i & k 的限制是为了 n - i >= k - j >= 0

然后你可以得到这样的东西来计算 dfs(n, k)。然后我们固定一下 \(j\),能贡献它的 \(i\) 是一段区间,可以使用变上限求和 \(\sum\limits_{i = 0} ^ n {i \choose k} = {n + 1 \choose k + 1}\) 来快速计算。

namespace liuzimingc {
#define pii pair<int, int>
#define endl '\n'

const int maxn = 1e7 + 5, mod = 998244353;

int T, n, k;
long long fac[maxn], inv[maxn];

int qkpow(long long a, int b) {
	long long ans = 1;
	while (b) {
		if (b & 1) ans = ans * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return ans;
}

int C(int n, int m) {
	if (n < m) return 0;
	return fac[n] * inv[m] % mod * inv[n - m] % mod;
}

int get(int n, int k) {
	return C(n + 1, k + 1);
}

int get_sum(int l, int r, int k) {
	return (get(r, k) - get(l - 1, k) + mod) % mod;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	fac[0] = 1;
	for (int i = 1; i <= 10000001; i++) fac[i] = fac[i - 1] * i % mod;
	inv[10000001] = qkpow(fac[10000001], mod - 2);
	for (int i = 10000000; ~i; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
	cin >> T;
	while (T--) {
		cin >> n >> k;
		int ans = 0;
		for (int x = 0; x <= k; x++) {
			int j = k - x;
			int l = n - min(j + n - k, 2 * j - 1), r = n - (j + 1);
			if (l <= r) (ans += get_sum(l, r, x)) %= mod;
		}
		cout << (C(n, k) - ans + mod) % mod << endl;
	}
	return 0;
} 
#undef int
}

标签:long,return,int,纪念,dfs,逝去,ans,40pts,mod
From: https://www.cnblogs.com/liuzimingc/p/18574219/t3

相关文章

  • 逝去的那些不太完整的碎片+拾取+英语+语法
    文章目录英语语法复习英语语法复习一、时态一般现在时概念:表示经常发生的动作、存在的状态或习惯性的行为。结构:主语+动词原形(第三人称单数作主语时,动词要加-s或-es)。例如:Ioftengotoschoolbybike.(我经常骑自行车去上学。)Hestudieshardeveryday.(他......
  • 深入浅出学算法045-纪念品分组
    题目描述元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪......
  • 【C++-NOIP篇-4】 [NOIP2007 普及组] 纪念品分组
    文章目录[NOIP2007普及组]纪念品分组题目背景题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示题目思路完整Code[NOIP2007普及组]纪念品分组题目背景NOIP2007普及组T2题目描述元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参......
  • [水墨周年纪念墙] 照片 & 回忆 & 意义 经历
    标题:[水墨周年纪念墙]照片&回忆&意义 经历个人主页@水墨不写bug本篇是水墨的照片墙,回顾我的近一年的经历~//_ooOoo_////o8888888o////......
  • P1094 [NOIP2007 普及组] 纪念品分组
    [NOIP2007普及组]纪念品分组题目背景NOIP2007普及组T2题目描述元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能......
  • 纪念某模拟赛 8.6 k 代码
    夏虫(summer)题意简述:用\(n\)个虫子,每个虫子有一个狡猾值\(a_i\),一开始你会站在一个虫子\(x\)前,将初始能力值设为\(a_x\),并捕捉它,接下来你可以重复执行三种操作,直到捕捉完所有昆虫:设当前捕捉到了区间\([l,r]\)的昆虫,能力值为\(v\)若\(l\ne1\)并且\(a_{l−1}......
  • 纪念第一次在 Github 上提 ISSUE 得到了老哥的回复
    背景第一次在GitHub上提ISSUE,提问的内容就是我的上一篇博文rustlingsv6.0运行时出现“YouaretryingtorunRustlingsusingtheoldmethodbeforeversion6”,当时搞了好长时间都没思绪,然后就抱着试一试的心态在上面提了一个ISSUE。提问之后,又慢慢理了一下思路,终于......
  • dp(2019csp-j纪念品)
    #include<bits/stdc++.h>usingnamespacestd;intn,T,a[101][101],v[101],f[10010];voidsolve(intd1,intd2){memset(f,0,sizeof(int)*(v[d1]+1));for(inti=1;i<=n;i++){intc=a[d1][i],w=a[d2][i];......
  • 上总榜啦,纪念一下。( 总榜24 分榜第7 )全网最硬核博主之一
    s如何用sql在1分钟从1T数据中精准定位查询?Hive离线数仓Spark分析-CSDN博客文章浏览阅读1.3k次,点赞48次,收藏15次。在大数据-Hadoop体系中,spark批处理和hive离线数仓可以说是对立并行的两个大分支技术栈,,,建议主攻其一,另一个灵活使用就行。他们是2015出现在国内,2017年之后国外各......
  • 2024中山纪念暑假集训日记
    2024/8/6摆烂的一天上午专心打了一场模拟赛1h想出来T1,1h打,1h调,终于在本次集训中第一次切了一道题1h想T2,本来想到正解力,但急着打暴力,没管,最后暴力挂了,遗憾的中午快乐的看gyy和隔壁象棋大佬下棋,精彩!遗憾的就是gyy下的太慢了,马上就要输了然而却睡觉了,属于是一个急下午在写教主......