2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)

文章目录

  • description
  • solution
  • code

description

TTT组测试数据

对于两个长度为KKK的数列{a}\{a\}{a}{b}\{b\}{b},满足∑i=1Kai=N,∑i=1Kbi=M\sum_{i=1}^Ka_i=N,\sum_{i=1}^Kb_i=Mi=1Kai=N,i=1Kbi=M

对于这两个数列,定义权值为P=∏i=1Kmin⁡(ai,bi)P=\prod_{i=1}^K\min(a_i,b_i)P=i=1Kmin(ai,bi)

求所有可能的数列的权值之和∑{a},{b}P\sum_{\{a\},\{b\}}P{a},{b}P

答案对998244353998244353998244353取模

K≤min⁡(N,M)N,M≤5e5T≤100K\le \min(N,M)\quad N,M\le 5e5\quad T\le 100Kmin(N,M)N,M5e5T100

solution

虽然代码非常短,但是要理解简直要命

我们可以构造一个二维数组c[2][K]c[2][K]c[2][K],要求c[0][i]=c[1][i]c[0][i]=c[1][i]c[0][i]=c[1][i]第i位不能为0

设计的初衷是让c[0][K]c[0][K]c[0][K]为构造{a}\{a\}{a}c[1][K]c[1][K]c[1][K]为构造{b}\{b\}{b}服务

再构造两个一维数组A[K],B[K]A[K],B[K]A[K],B[K]第i位可以为0

通过构造出来的这些数组生成最后的{a},{b}\{a\},\{b\}{a},{b}

  • a[i]=c[0][i]+A[i]a[i]=c[0][i]+A[i]a[i]=c[0][i]+A[i]
  • b[i]=c[1][i]+B[i]b[i]=c[1][i]+B[i]b[i]=c[1][i]+B[i]

定义∑i=1Kc[0][i]=∑i=1Kc[1][i]=S\sum_{i=1}^Kc[0][i]=\sum_{i=1}^Kc[1][i]=Si=1Kc[0][i]=i=1Kc[1][i]=S

则对于{a}\{a\}{a}序列而言,剩下的N−SN-SNS就需要由AAA数组来弥补;{b}\{b\}{b}同理

考虑有多少个A/BA/BA/B数组满足其求和恰好弥补了空缺N−S/M−SN-S/M-SNS/MS

显然这可以通过组合数算出

  • A:C(N−S+K−1,K−1)A:C(N-S+K-1,K-1)A:C(NS+K1,K1)
  • B:C(M−S+K−1,K−1)B:C(M-S+K-1,K-1)B:C(MS+K1,K1)

AAA数组的计算方式为例,BBB同理

相当于把剩下的N−SN-SNS分成恰好KKK个盒子,隔板法,插入K−1K-1K1个板子

但是AAA的条件可以为000,意味着盒子可以为空,但这是隔板法不能求得的

可以通过给每个盒子分配111的占位相当于一个盒子,等价于将限制变成至少为111

考虑C(N−S+K−1,K−1)∗C(M−S+K−1,K−1)C(N-S+K-1,K-1)*C(M-S+K-1,K-1)C(NS+K1,K1)C(MS+K1,K1)

发现这两个组合数相乘有非常实际的意义

这求出的恰好是将所有满足∀1≤i≤Kc[0][i]≤a[i]\forall_{1\le i\le K}\ c[0][i]\le a[i]1iK c[0][i]a[i]{a}\{a\}{a}∀1≤i≤Kc[0][i]≤b[i]{b}\forall_{1\le i\le K}\ c[0][i]\le b[i]\{b\}1iK c[0][i]b[i]{b}组合都计算了恰好一次


接着我们考虑对于一组特定ccc数组和特定A,BA,BA,B数组(也就是一组特定的{a},{b}\{a\},\{b\}{a},{b})的贡献

∏i=1Kmin⁡(ai,bi)\prod_{i=1}^K\min(a_i,b_i)i=1Kmin(ai,bi) 这是题目定义的贡献

思考一下,这样一组特定的{a},{b}\{a\},\{b\}{a},{b},会被多少个ccc计算到?

  • 显然是∏i=1Kmin⁡(ai,bi)\prod_{i=1}^K\min(a_i,b_i)i=1Kmin(ai,bi)

    每一位iii都满足c[0][i]=c[1][i]≤min⁡(ai,bi)c[0][i]=c[1][i]\le\min(a_i,b_i)c[0][i]=c[1][i]min(ai,bi)就行,因为ccc要求不能为000,而A,BA,BA,B要求可以为000

    将每一位c[i]c[i]c[i]的可取值个数相乘,即是能利用A,BA,BA,B修补成{a},{b}\{a\},\{b\}{a},{b}的所有ccc的组合

于是乎,发现非常巧妙地将答案的乘积和转化成了计数个数贡献

再转个弯,我们直接计算每个特定的ccc会对多少个{a},{b}\{a\},\{b\}{a},{b}提供111的计数贡献,求和就等价于原问题的总贡献

然而,又发现了一个非常巧妙的性质,和(S)相同的ccc产生的计数贡献是一样的(但不是贡献的{a},{b}\{a\},\{b\}{a},{b}完全相同的意思)

  • 要证明这个性质,就需要再转个弯,用到最开始的组合数推导

    剩下的N−S,M−SN-S,M-SNS,MS都需要A,BA,BA,B的补给

    A,BA,BA,B怎么补给,最后生成的{a},{b}\{a\},\{b\}{a},{b}会因此而固定

    是一对一的关系

这个计数贡献自然是CS−1,K−1C_{S-1,K-1}CS1,K1

  • 插板法

    ccc的和为SSS,要求分成KKK个盒子,盒子不能为空

    相当于有S−1S-1S1个空位需要插入K−1K-1K1个板

最后就成功不用生成函数解决这道题了!!!

现在总结,就只有一句话,最开始的c,A,Bc,A,Bc,A,B构造简直就是神来之笔

后面所有的推导全都是建立在最开始的规则设定基础上

真的妙极了!!

code

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define mod 998244353
#define maxn 1000005
int fac[maxn], inv[maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}void init( int n ) {fac[0] = inv[0] = 1;for( int i = 1;i <= n;i ++ )fac[i] = fac[i - 1] * i % mod;inv[n] = qkpow( fac[n], mod - 2 );for( int i = n - 1;i;i -- )inv[i] = inv[i + 1] * ( i + 1 ) % mod;
}int C( int n, int m ) {return fac[n] * inv[m] % mod * inv[n - m] % mod;
}signed main() {init( 1e6 );int n, m, k, T;scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld %lld", &n, &m, &k );int ans = 0;for( int i = k;i <= min( n, m );i ++ )ans = ( ans + C( i - 1, k - 1 ) * C( n - i + k - 1, k - 1 ) % mod * C( m - i + k - 1, k - 1 ) ) % mod;printf( "%lld\n", ans );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署Chart应用并使用.net core读取Kubernetes中的configMap

上一篇文章讲了 k8s使用helm打包chart并上传到腾讯云TencentHub&#xff0c;今天就讲一下使用Helm部署应用并使用configMap代替asp.net core 中的appsettings.json文件。把Chart上传到TencentHub之后&#xff0c;我们就可以通过腾讯云的容器服务&#xff0c;直接部署Helm应用了…

Vases and Flowers HDU - 4614

Vases and Flowers HDU - 4614 题意: 一排空瓶子放花&#xff0c;操作1&#xff1a;从第x个瓶子开始放花&#xff0c;放y朵花&#xff0c;每个瓶子就一朵花&#xff0c;如果碰到已经有花的瓶子跳过这个瓶子&#xff0c;看下一个&#xff0c;当花没了&#xff0c;或者瓶子不够…

洛谷P3327:[SDOI2015]约数个数和(莫比乌斯反演)

枚举倍数的一种灵活的变形&#xff1a;g(d)∑d∣inf(i)∑i1⌊nd⌋f(i⋅d)g(d)\sum_{d|i}^nf(i)\sum_{i1}^{\lfloor\frac{n}{d}\rfloor}f(i\cdot d)g(d)∑d∣in​f(i)∑i1⌊dn​⌋​f(i⋅d) 很显然&#xff0c;但有时能发挥大作用。 其实本质还是要理解西格玛究竟是在算什么 解析…

EFCore Lazy Loading + Inheritance = 干净的数据表 (一)

前言α角 与 β角关于α角 与 β角的介绍&#xff0c;请见上文 如何用EFCore Lazy Loading实现Entity Split。本篇会继续有关于β角的彩蛋在等着大家去发掘。/斜眼笑其他本篇的程序&#xff0c;可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/InheritanceWithE…

专题突破之反悔贪心——建筑抢修,Cow Coupons G, Voting (Hard Version),Cardboard Box

文章目录[JSOI2007]建筑抢修[USACO12FEB]Cow Coupons GCF1251E2 Voting (Hard Version)CF436E Cardboard Box[JSOI2007]建筑抢修 luogu4053 将建筑按照结束时间从小到大排序 然后记录一下已经修理的建筑总共的花费时间 如果花费时间加上现在这个建筑的修建时间超过了这个建…

Max Sum Plus Plus HDU - 1024

Max Sum Plus Plus HDU - 1024 题意&#xff1a; 给你n个数&#xff0c;选m个子段&#xff0c;各个子段连续且不相交&#xff0c;长度可以为1&#xff0c;设maxn为各个子区间的和&#xff0c;求最大的maxn。 题解&#xff1a; 设dp[i][j]表示前j个数分成i段的最大值 对于第…

模板:杜教筛(莫比乌斯反演、数论)

所谓杜教筛&#xff0c;就是dms教给我们的筛 &#xff08;逃&#xff09; 前言 与其说算法&#xff0c;不如说是技巧。 可以在低于线性的时间复杂度&#xff08;准确的说是 O(n23)O(n^{\frac{2}{3}})O(n32​)&#xff09;内完成对积性函数的前缀和计算。 解析 考虑求函数 f…

程序员过关斩将--快速迁移10亿级数据

菜菜呀&#xff0c;咱们业务BJKJ有个表数据需要做迁移程序员主力 Y总现在有多少数据&#xff1f;菜菜大约21亿吧&#xff0c;2017年以前的数据没有业务意义了&#xff0c;给你半天时间把这个事搞定&#xff0c;绩效给你A程序员主力 Y总有绩效奖金吗&#xff1f;菜菜钱的事你去问…

[2021-09-09 T2] 就差⼀点——冒泡排序和反序表之间不为人知的秘密

就差一点解题报告descriptionsolutioncodedescription 题目描述 冒泡排序是⼀个简单的排序算法&#xff0c;其时间复杂度为O(n2)O(n^2)O(n2) 有⼀个大小为nnn的排列p1,...,pnp_1,...,p_np1​,...,pn​&#xff0c;⼩明想对这个排列进⾏冒泡排序&#xff0c;于是写了下⾯这份…

CodeForces - 76E Points

CodeForces - 76E Points 题意&#xff1a; 给你n个点的坐标&#xff0c;求所有一对点之间的距离的平方和 n<100000 题解&#xff1a; 直接暴力n2肯定不行&#xff0c;我们把这个的式子列出来&#xff1a; 代码&#xff1a; #include<bits/stdc.h> #define deb…

模板:Miller-RabinPollard-Rho(数论)

所谓 pollard-rho&#xff0c;就是泼辣的肉 &#xff08;逃&#xff09; 前言 许多题解都把这两个算法放在了一起。 那我也这样办吧&#xff01; miller-rabin可以在优秀的时间复杂度内完成对一个数的素性检测。 而pollard-rho则是立足于Miler-rabin之上&#xff0c;可以在 …

Asp.NetCore轻松学-部署到 Linux 进行托管

前言上一篇文章介绍了如何将开发好的 Asp.Net Core 应用程序部署到 IIS&#xff0c;且学习了进程内托管和进程外托管的区别&#xff1b;接下来就要说说应用 Asp.Net Core 的特性&#xff08;跨平台&#xff09;&#xff0c;将 .NetCore 部署到 Linux 中&#xff0c;主流的 Linu…

DevC++ 用C语言的多线程 实现简单的客户端和服务器

知识来源一&#xff1a; 使用Dev-C实现简单的客户端和服务器-CSDN博客 此先生的博客使用的是win32 SDK来创建多线程&#xff0c;然后鄙人对这个版本的多线程细节不明。于是又重新用C语言的线程替代win32API,以此继续学习服务器代码。 知识来源二&#xff1a;DevC 多线程创建…

[2021-09-09 T3] 序列/luogu P3943 星空(异或差分+bfs最短路+状压dp)

序列descriptionsolutioncodedescription 题目描述 长度为nnn的序列&#xff0c;初始全为000&#xff0c;每次可以选择⼀个数ai(1≤i≤l)a_i(1\le i\le l)ai​(1≤i≤l)&#xff0c;然后选择连续aia_iai​个元素异或上111 求最少的次数&#xff0c;使得对于所有i(1≤i≤k)i(…

HDU - 4608 I-number

题意&#xff1a; 给你一个x&#xff0c;让你构造一个y&#xff0c;y的要求&#xff1a; y>xy的各项之和为10的倍数在满足前两个的前提下&#xff0c;y尽可能小 题解&#xff1a; 模拟&#xff0c;尽可能的模拟&#xff0c;用字符串模拟 先将各位相加得到sum&#xff0c…

从初创公司的角度来看微服务

在开展微服务的过程中&#xff0c;了解要考虑哪些因素可能是非常有挑战性的事情。没有可以直接使用的金科玉律。每个过程都是不同的&#xff0c;因为每个组织面临的都是不同的环境。在本文中&#xff0c;我将从初创公司的角度分享我们学习到的经验和面临的挑战&#xff0c;以及…

洛谷P2056:[ZJOI2007]捉迷藏(点分树、STL)

解析 见到动态维护最远点对&#xff0c;不难想到利用 set 维护最大值和次大值&#xff0c;每个点维护两个 set 的杂技做法。 但是问题是…T了啊。 咋办嘞。 一个在本题至关重要的 trick&#xff1a;利用两个堆来支持访问最大值和删除 具体也很好理解&#xff1a;当删除的时候…

[NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

[NOI2018] 归程descriptionsolution1code1solution2codedescription 题目描述 本题的故事发生在魔力之都&#xff0c;在这里我们将为你介绍一些必要的设定 魔力之都可以抽象成一个nnn个节点、mmm条边的无向连通图&#xff08;节点的编号从111至nnn&#xff09;我们依次用 l,…

CodeForces - 616D Longest k-Good Segment

CodeForces - 616D Longest k-Good Segment 题意&#xff1a; 有包含n个数的序列a&#xff0c;求能找到最长的区间包含不超过k个不同的元素。 题解&#xff1a; 尺取法&#xff0c;先固定L&#xff0c;然后移动R&#xff0c;R每次移动&#xff0c;当超过k后&#xff0c;L再…

MySQL 集群方案介绍

mysql集群方案这里介绍2种&#xff0c;PXC 和 Replication。大型互联网程序用户群体庞大&#xff0c;所以架构设计单节点数据库已经无法满足需求。大家也深有体会&#xff0c;有一万人在学校网站查成绩或是选课的时候网站时常是访问不了或者相应特别特别慢。这种情况就凸显出来…