「TJOI2019」唱、跳、rap 和篮球
题目分析
据说这是一道生成函数题
看到限制条件,我们首先想到的就是对有多少组讨论cxk的人进行容斥。然后就是求剩下的人随便放有多少种方法了。考虑现在每种剩\(a,b,c,d\)人,还需要排\(n\)人,那么方案数就是
\]
其中\([]\)内表达式为真时,值为\(1\),否则为\(0\)。
可以化简为
\]
这个式子暴力求得话复杂度明显不对,他是\(O(n^3)\)的。
考虑只枚举\(i\)和\(j\)。那么满足\(0\leqslant n-i-j-k\leqslant d\)的\(k\)显然是一个连续的区间,不妨记作\([L,R]\)。那么对答案的贡献就是
\]
后面那个求和预处理加前缀和即可\(O(1)\)求得。那么时间复杂度就降到了\(O(n^2)\)。加上外面一层容斥,那么总时间复杂度就是\(O(n^3)\)。
实现的时候注意边界条件!!!
参考程序
码风氪化
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL Maxn = 1010;
const LL Maxa = 510;
const LL Mod = 998244353;
LL N, A[ 4 ], Fact[ Maxn ], Inv[ Maxn ], C[ Maxn ][ Maxn ], Sum[ Maxn ][ Maxn ], Ans;
void Exgcd( LL a, LL b, LL &x, LL &y ) { if( b == 0 ) { x = 1; y = 0; return; } Exgcd( b, a % b, y, x ); y -= a / b * x; return; }
LL inv( LL a ) { LL x, y; Exgcd( a, Mod, x, y ); if( x < 0 ) x += Mod; return x; }
LL S( LL n, LL l, LL r ) { LL Ans = Sum[ n ][ r ]; if( l ) Ans = ( Ans - Sum[ n ][ l - 1 ] + Mod ) % Mod; return Ans; }
LL Cal( LL Sta ) {
LL Ans = 0; for( LL i = 0; i < 4; ++i ) A[ i ] -= Sta;
for( LL i = 0; i <= A[ 0 ] && i <= N - Sta * 4; ++i )
for( LL j = max( 0LL, N - Sta * 4 - A[ 2 ] - A[ 3 ] - i ); j <= A[ 1 ] && i + j <= N - Sta * 4; ++j ) {
Ans = ( Ans + C[ N - Sta * 4 ][ i ] * C[ N - Sta * 4 - i ][ j ] % Mod * S( N - Sta * 4 - i - j, max( 0LL, N - Sta * 4 - i - j - A[ 3 ] ), min( N - Sta * 4 - i - j, A[ 2 ] ) ) % Mod ) % Mod;
}
for( LL i = 0; i < 4; ++i ) A[ i ] += Sta; return Ans;
}
void Work() {
for( LL i = 0; i <= N / 4; ++i ) {
for( LL j = 0; j < 4; ++j ) if( i > A[ j ] ) return;
if( i & 1 ) Ans = ( Ans - C[ N - i * 3 ][ i ] * Cal( i ) % Mod + Mod ) % Mod;
else Ans = ( Ans + C[ N - i * 3 ][ i ] * Cal( i ) % Mod ) % Mod;
}
return;
}
int main() {
scanf( "%lld", &N ); for( LL i = 0; i < 4; ++i ) scanf( "%lld", &A[ i ] );
Fact[ 0 ] = 1; for( LL i = 1; i <= N; ++i ) Fact[ i ] = Fact[ i - 1 ] * i % Mod;
Inv[ N ] = inv( Fact[ N ] ); for( LL i = N - 1; i >= 0; --i ) Inv[ i ] = Inv[ i + 1 ] * ( i + 1 ) % Mod;
for( LL i = 0; i <= N; ++i ) for( LL j = 0; j <= i; ++j ) C[ i ][ j ] = Fact[ i ] * Inv[ j ] % Mod * Inv[ i - j ] % Mod;
for( LL i = 0; i <= N; ++i ) for( LL j = 0; j <= i; ++j ) Sum[ i ][ j ] = ( Sum[ i ][ j - 1 ] + C[ i ][ j ] ) % Mod;
Work(); printf( "%lld\n", Ans );
return 0;
}
「TJOI2019」唱、跳、rap 和篮球的更多相关文章
- 「TJOI2019」唱、跳、rap 和篮球 题解
题意就不用讲了吧-- 鸡你太美!!! 题意: 有 \(4\) 种喜好不同的人,分别最爱唱.跳. \(rap\).篮球,他们个数分别为 \(A,B,C,D\) ,现从他们中挑选出 \(n\) 个人并进行 ...
- [bzoj5510]唱跳rap和篮球
显然答案可以理解为有(不是仅有)0对情况-1对情况+2对情况-- 考虑这个怎么计算,先计算这t对情况的位置,有c(n-3t,t)种情况(可以理解为将这4个点缩为1个,然后再从中选t个位置),然后相当于 ...
- 【LOJ】#3109. 「TJOI2019」甲苯先生的线段树
LOJ#3109. 「TJOI2019」甲苯先生的线段树 发现如果枚举路径两边的长度的话,如果根节点的值是$x$,左边走了$l$,右边走了$r$ 肯定答案会是$(2^{l + 1} + 2^{r + ...
- LG5337/BZOJ5508 「TJOI2019」甲苯先生的字符串 线性动态规划+矩阵加速
问题描述 LG5337 BZOJ5508 题解 设\(opt_{i,j}(i \in [1,n],j \in [1,26])\)代表区间\([1,i]\),结尾为\(j\)的写法. 设\(exist_ ...
- LG5338/BZOJ5509/LOJ3105 「TJOI2019」甲苯先生的滚榜 Treap
问题描述 LG5338 LOJ3105 BZOJ5509 题解 建立一棵\(\mathrm{Treap}\),把原来的\(val\)换成两个值\(ac,tim\) 原来的比较\(val_a<va ...
- LOJ#3104「TJOI2019」甲苯先生的字符串
题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...
- 「TJOI2019」大中锋的游乐场
题目链接 问题分析 比较明显的最短路模型.需要堆优化的dij.建图的时候注意细节就好. 参考程序 #include <bits/stdc++.h> #define LL long long ...
- 「TJOI2019」甲苯先生的滚榜
题目链接 问题分析 参照数据范围,我们需要一个能够在\(O(n\log n)\)复杂度内维护有序数列的数据结构.那么平衡树是很好的选择.参考程序中使用带旋Treap. 参考程序 #pragma GCC ...
- 将Android手机无线连接到Ubuntu实现唱跳Rap
您想要将Android设备连接到Ubuntu以传输文件.查看Android通知.以及从Ubuntu桌面发送短信 – 你会怎么做?将文件从手机传输到PC时不要打电话给自己:使用GSConnect就可以. ...
随机推荐
- python网络编程-Json序列化功能扩展-软件开发架构-OSI七层协议-TCP-01
面向对象补充知识点(面向对象的应用) 扩展json序列化所支持的数据类型(分析源码) import json from datetime import datetime, date # ------- ...
- 基于MatConvNet的CNN图像搜索引擎PicSearch
简介 Picsearch是一种基于卷积神经网络特征的图像搜索引擎. Github:https://github.com/willard-yuan/CNN-for-Image-Retrieval Web ...
- 使用zookeeper报错 stat is not executed because it is not in the whitelist. envi is not executed because it is not in the whitelist.
在使用四字命令或者zk ui界面查看zookeeper集群时,出现如下提示: stat is not executed because it is not in the whitelist. envi ...
- Volatile可见性 与 Synchronization原子性的优化
Volatile可见性 比如现在我们有这样一段代码:线程等待另一个线程将数据装载完就输出success,可是最后程序一直卡在while循环里没有往下执行. public class VolatileD ...
- 安装kubuctl
安装和设置kubectl 使用Kubernetes命令行工具kubectl在Kubernetes上部署和管理应用程序.使用kubectl,可以检查集群资源; 创建,删除和更新组件. 以下是安装kube ...
- 06 Python网络爬虫requets模块高级用法
一. 基于requests模块的cookie操作 - cookie概念: 当用户通过浏览器访问一个域名的时候,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就 ...
- 【Activiti】crm与工作流的整合,一个完整的流程实例创建到任务完成的过程
1.建立任务列表页面--根据用户的nickName作为assignee查询其所拥有的任务列表 2.在任务后添加办理按钮 3.点击办理按钮,出现流程办理框,其中详细显示了该任务的相关详细信息,本实例中为 ...
- 好用的 python 工具集合
图标处理小程序, 妈妈再也不用担心我不会制作图标了 # PythonMargick包可以到Unofficial Windows Binaries for Python Extension Packag ...
- 使用RedisTemplate的操作类访问Redis(转载)
原文地址:http://www.cnblogs.com/luochengqiuse/p/4641256.html private ValueOperations<K, V> valueOp ...
- K8S概念
1.master master是集群的网关和中枢,负责诸如为用户和客户端暴露api.跟踪其他服务器的健康状态.以最优方式调度工作负载,以及编排其他组件之间的通信等服务,它是用户或客户端与集群之间的核心 ...