题目链接

题目分析

据说这是一道生成函数题

看到限制条件,我们首先想到的就是对有多少组讨论cxk的人进行容斥。然后就是求剩下的人随便放有多少种方法了。考虑现在每种剩\(a,b,c,d\)人,还需要排\(n\)人,那么方案数就是

\[\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^c\sum_{l=1}^d [i+j+k+l=n]{n\choose i}{n - i\choose j}{n-i-j\choose k}{n-i-j-k\choose l}
\]

其中\([]\)内表达式为真时,值为\(1\),否则为\(0\)。

可以化简为

\[\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^c[0\leqslant n-i-j-k\leqslant d]{n\choose i}{n-i\choose j}{n-i-j \choose k}
\]

这个式子暴力求得话复杂度明显不对,他是\(O(n^3)\)的。

考虑只枚举\(i\)和\(j\)。那么满足\(0\leqslant n-i-j-k\leqslant d\)的\(k\)显然是一个连续的区间,不妨记作\([L,R]\)。那么对答案的贡献就是

\[{n\choose i}{n-i\choose j}\sum_{k=L}^R{n-i-j\choose k}
\]

后面那个求和预处理加前缀和即可\(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 和篮球的更多相关文章

  1. 「TJOI2019」唱、跳、rap 和篮球 题解

    题意就不用讲了吧-- 鸡你太美!!! 题意: 有 \(4\) 种喜好不同的人,分别最爱唱.跳. \(rap\).篮球,他们个数分别为 \(A,B,C,D\) ,现从他们中挑选出 \(n\) 个人并进行 ...

  2. [bzoj5510]唱跳rap和篮球

    显然答案可以理解为有(不是仅有)0对情况-1对情况+2对情况-- 考虑这个怎么计算,先计算这t对情况的位置,有c(n-3t,t)种情况(可以理解为将这4个点缩为1个,然后再从中选t个位置),然后相当于 ...

  3. 【LOJ】#3109. 「TJOI2019」甲苯先生的线段树

    LOJ#3109. 「TJOI2019」甲苯先生的线段树 发现如果枚举路径两边的长度的话,如果根节点的值是$x$,左边走了$l$,右边走了$r$ 肯定答案会是$(2^{l + 1} + 2^{r + ...

  4. LG5337/BZOJ5508 「TJOI2019」甲苯先生的字符串 线性动态规划+矩阵加速

    问题描述 LG5337 BZOJ5508 题解 设\(opt_{i,j}(i \in [1,n],j \in [1,26])\)代表区间\([1,i]\),结尾为\(j\)的写法. 设\(exist_ ...

  5. LG5338/BZOJ5509/LOJ3105 「TJOI2019」甲苯先生的滚榜 Treap

    问题描述 LG5338 LOJ3105 BZOJ5509 题解 建立一棵\(\mathrm{Treap}\),把原来的\(val\)换成两个值\(ac,tim\) 原来的比较\(val_a<va ...

  6. LOJ#3104「TJOI2019」甲苯先生的字符串

    题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...

  7. 「TJOI2019」大中锋的游乐场

    题目链接 问题分析 比较明显的最短路模型.需要堆优化的dij.建图的时候注意细节就好. 参考程序 #include <bits/stdc++.h> #define LL long long ...

  8. 「TJOI2019」甲苯先生的滚榜

    题目链接 问题分析 参照数据范围,我们需要一个能够在\(O(n\log n)\)复杂度内维护有序数列的数据结构.那么平衡树是很好的选择.参考程序中使用带旋Treap. 参考程序 #pragma GCC ...

  9. 将Android手机无线连接到Ubuntu实现唱跳Rap

    您想要将Android设备连接到Ubuntu以传输文件.查看Android通知.以及从Ubuntu桌面发送短信 – 你会怎么做?将文件从手机传输到PC时不要打电话给自己:使用GSConnect就可以. ...

随机推荐

  1. Laravel之杂记

    1.composer设置国内镜像加速 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 2 ...

  2. 学习django: 庄园漫步

    最近在阅读django的资料. 发现一个系列写得很好. <被解放的姜戈> 作者:Vamei     出处:http://www.cnblogs.com/vame 感谢大神指路呀~

  3. Docker 镜像与容器管理

    镜像与容器简介 Docker的大部分操作都围绕着它的三大核心概念:镜像.容器.仓库而展开.因此,准确把握这三大核心概念对于掌握Docker技术尤为重要,在docker中,我们重点关注的就是镜像和容器了 ...

  4. 调用webService学习小结

    这段时间项目进行到了最后时刻,但是还有很多需求没有搞清楚,眼看deadline越来越近,压力也越来越大.现在我的主要工作是将别人开发好的一个系统给加载到我们系统中,使用的方法是通过webService ...

  5. luogu题解 P1707 【刷题比赛】矩阵加速递推

    题目链接: https://www.luogu.org/problemnew/show/P1707 分析: 洛谷的一道原创题,对于练习矩阵加速递推非常不错. 首先我们看一下递推式: \(a[k+2]= ...

  6. mybatis-plus简单了解

    mybatis-plus入门了解和简单使用 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 特性: ...

  7. 彻底了解websocket原理

    一.websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1 ...

  8. node.js学习之路(1)

    node.js 属于后台语言,后台语言还有php,java等. 优势:1.性能好   node.js VS php   86倍 2.跟前台JS配合方便 3.node.js便于前端学习 https:// ...

  9. node + express搭建api项目

    express框架 描述 express是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能. 安装 // 1.使用npm淘宝镜像--cn ...

  10. stm32 development

    1.www.st.com st官网 2.www.stmcu.com.cn st中文网 3.www.stmcu.org.cn st中文社区