C. Easy

构造两个序列分别要满足 \(\sum_{i=1}^{k} a_{i} = N\) \(\sum_{i=1}^{k} b_{i} = M\)

一种方案能贡献\(\prod_{i=1}^{k} min(a_{i}, b_{i})\) 的分数 求所有方案分数的和

生成函数

对于一个序列 \(a_{0},a_{1},a_{2}\)···

定义它的生成函数为 \(G(x) = a_{0} + a_{1}x + a_{2}x^{2}\)···

生成函数有指数和系数两维信息 所以用来解决计数问题非常强大 因此生成函数的构造是比较关键的

在本题中一个序列不同的方案数 其实就是就把N划分成K个数的方案数

对于每一个数我们可以用一个生成函数\(G(x) = x+x^{2}+x^{3}\)···来表示

它的意义是 每一项其实就是一种操作 比如\(x^{2}\)表示让这一位为2(指数)的方案数为1(系数)

那么把N划分成K个数的方案数就是 \((G(x))^{k} = (x + x^{2}+x^{3}···)^{k}\) 中\(x^{N}\)的系数

如果想维护出一个序列所有方案分数的和 我们可以巧妙的构造 \((G(x))^{k} = (x + 2x^{2}+3x^{3}···)^{k}\)

它的意义是 比如\(2x^{2}\)表示让这一位为2(指数)能让这一种方案的分数\(*2\)(系数)

min的生成函数

容易想到 对于两个数我们可以构造一个生成函数\(G(x,y) = (x + x^{2} + x^{3}···)(y+y^{2}+y^{3}···)\) 用\(x^{i}y^{j}\)来表示第一个数为i 第二个数为j

我们只用了它的指数 显然还有系数可以用来维护信息 能不能用一种构造使得它的系数为\(min(i,j)\)呢

先上结论 我们可以在\(G(x,y)\)后乘上一个\(1+xy+x^{2}y^{2}\)···

理解一下 假设\(i<j\) 它实际上是提供了一个映射 让原来的\(x^{i}y^{j},x^{i-1}y^{j-1},x^{i-2}y^{j-2}···x^{1}y^{j-i+1}\)一共\(i\)项都为\(x^{i}y^{j}\)的系数做了一次贡献

所以在这个多项式里\(x^{i}y^{j}\)的系数恰好为\(min(i,j)\)

题解

综上所述 答案为\(G(x,y) = (x + x^{2} + x^{3}···)^{k}(y+y^{2}+y^{3}···)^{k}(1+xy+x^{2}y^{2}···)^{k}\)这个多项式中\(x^{N}y^{M}\)的系数

我们可以枚举最后一项中\(x^{i}y^{i}\)的指数 就可以得到第一个项中\(x\)的指数为\(N-i\) 第二项\(y\)的指数为\(M-i\)

然后分别计算它们的系数 最后一项是把i个物品分为K个可以为空的集合 前两项分别是把\(N-i\)和\(M-i\)个物品分为K个非空集合

\(ans = \sum_{0}^{min(N-K,M-K)} \binom{N-i-1}{K-1} \binom{M-i-1}{K-1} \binom{i+K-1}{i}\)

#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int mod = 998244353;
const int MAXN = 1000005;
int n, m, k;
int fac[MAXN];
int ny[MAXN];
int inv[MAXN]; int C(int x, int y) {
if(x < y || y < 0 || x < 0) return 0;
return 1LL * fac[x] * inv[x - y] % mod * inv[y] % mod;
} int main() {
fac[0] = ny[0] = inv[0] = 1; ny[1] = 1;
for(int i = 1; i <= 1000000; i++) {
fac[i] = 1LL * i * fac[i - 1] % mod;
if(i > 1) ny[i] = 1LL * ny[mod % i] * (mod - mod / i) % mod;
inv[i] = 1LL * ny[i] * inv[i - 1] % mod;
} int T;
cin>>T;
while(T--) {
scanf("%d%d%d", &n, &m, &k); int ans = 0;
for(int i = 0; i <= min(n, m) - k; i++) {
int tmp = 1LL * C(k + i - 1, i) * C(n - i - 1, k - 1) % mod * C(m - i - 1, k - 1) % mod;
ans = (ans + tmp) % mod;
}
printf("%d\n", ans);
} return 0;
}

2020Nowcode多校 Round5 C. Easy的更多相关文章

  1. 2017多校Round5(hdu6085~hdu6095)

    补题进度:7/11 1001(模意义下的卷积) 题意: 给出长度<=50000的两个数组A[] B[],保证数组中的值<=50000且A[]中数字两两不同,B[]中数字两两不同 有5000 ...

  2. 2020Nowcode多校 Round9 B.Groundhog and Apple Tree

    题意 给一棵树 初始\(hp=0\) 经过一条边会掉血\(w_{i}\) 第一次到达一个点可以回血\(a_{i}\) 在一个点休息\(1s\)可以回复\(1hp\) 血不能小于\(0\) 每条边最多经 ...

  3. 2019牛客多校 Round5

    Solved:4 Rank:122 补题:8/10 A digits 2 签到 把这个数写n遍 #include <bits/stdc++.h> using namespace std; ...

  4. 2016弱校联盟十一专场10.5---As Easy As Possible(倍增)

    题目链接 https://acm.bnu.edu.cn/v3/contest_show.php?cid=8506#problem/A problem description As we know, t ...

  5. 2015弱校联盟(1) -A. Easy Math

    A. Easy Math Time Limit: 2000ms Memory Limit: 65536KB Given n integers a1,a2,-,an, check if the sum ...

  6. 湘潭校赛 Easy Wuxing

    Easy Wuxing Accepted : 25   Submit : 124 Time Limit : 1000 MS   Memory Limit : 65536 KB 题目描述 “五行”是中国 ...

  7. 2020牛客暑期多校训练营(第一场)Easy Integration

    传送门:J. Easy Integration 题意:给你n,求这个积分,最后的结果分子是记为p,分母记为q. 求(p*q-1)mod 998244353. 题解:比赛完看到巨巨说这是贝塔函数,我一搜 ...

  8. Solution -「LOCAL」「cov. 牛客多校 2020 第五场 C」Easy

    \(\mathcal{Description}\)   Link.(完全一致)   给定 \(n,m,k\),对于两个长度为 \(k\) 的满足 \(\left(\sum_{i=0}^ka_i=n\r ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. PHP 获取天气

    /** * 获取天气 */ function get_tq () { //获取用户ip地址 $ip = get_real_ip(); // $ip = '123.125.71.38'; //根据ip地 ...

  2. 【Java基础】数组和算法

    数组和算法 查找算法 线性查找 ... 二分查找 二分查找要求数据结构是有序的. package com.parzulpan.java.ch03; /** * @Author : parzulpan ...

  3. 【Dart】语言概述

    // 导入(import) // 导入核心库 //导入外部库 import 'package:test_api/test_api.dart'; // 导入文件 //import 'path/test. ...

  4. ajax跨域访问http服务--jsonp

    在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...

  5. Openstack Ocata 公共服务端(三)

    Openstack Ocata 公共服务端 mysql 安装: yum install mariadb mariadb-server mysql 安装过程省略 rabbit-server 安装包: # ...

  6. docker 常用的容器命令

    容器命令 # --name 给容器起名 # -p 端口映射 # -d 后台启动 # -it 交互模式启动 # 交互模式启动 # docker run -it 镜像名/id /bin/bash # do ...

  7. C语言补码(C语言学习笔记)

    记录 在学习C语言数据范围时了解到了补码的概念,记录一下什么是补码,补码怎么运算的 运算 原文链接:https://www.cnblogs.com/lsgsanxiao/p/5113305.html ...

  8. VGA调试心得

    以前自己调试过视频信号,无非就时钟加行场同步加数据线,如果视频信号出问题,第一看现象,第二测频率,反正出问题不是消隐信号出问题,就是时钟频率出问题.通过这种方式也调试成功过几个显示屏,然后就以为自己对 ...

  9. 前端面试之CSS权重问题!

    前端面试之CSS权重问题! 下面的权重按照从小到大来排列! 1.通用选择器(*) 2.元素(类型)选择器 权重1 3.类选择器 权重10 4.属性选择器 5.伪类 6.ID 选择器 权重100 7.内 ...

  10. Linux sudo权限提升漏洞整改方法

    一.漏洞概述 1月26日,Sudo发布安全通告,修复了一个类Unix操作系统在命令参数中转义反斜杠时存在基于堆的缓冲区溢出漏洞.当sudo通过-s或-i命令行选项在shell模式下运行命令时,它将在命 ...