[TJOI2019]唱、跳、rap和篮球
嘟嘟嘟
TJ律师函警告
20分暴力比较好拿,因为每一种学生可以理解为无限多,那么总方案数就是\(C_{n} ^ {4}\),然后我们枚举至少讨论cxk的有几组,容斥即可。
需要注意的是,容斥的时候还要考虑每一组的位置可以不一样,因此要用插板法计算方案:\(C_{i + n - 4i} ^ {i}\)。
剩下虽然没给暴力分,但其实能水到68。
我们\(O(n ^ 3)\)枚举\(a, b, c\)人数(这样就能算出来\(d\)的人数),设分别为\(i, j, k, h\)。然后根据可重集的全排列公式,方案数就是\(\frac{n!}{i! * j! * k! * h!}\)。这时候再枚举组数容斥减去即可。加几个break就能搞到68分。
然后机房乱搞之神ssy在这个思路的基础上直接水到100分:把容斥放在最外层;发现有一部分可以与处理;记忆化。但这里我们就不细讲了。
正解是NTT啥的,但我虽然会,可是懒得写。这里讲一个更简单的方法。
考虑到上面的复杂度瓶颈在于\(O(n ^ 3)\)枚举人数。我们可以换一种思路:枚举\(a, b\)之和\(t\),这样总方案数就是\(\sum _ {t = 0} ^ {n} (\sum _ {i = 0} ^ {t} C_{t} ^ {i} * \sum _ {k = 0} ^ {n - t} C_{n - t} ^ {k}) C_{n} ^ {t}\)。
然后发现中间的两个\(\sum\)是底数(但愿能这么叫)相同的连续组合数之和,于是可以预处理。如果不考虑容斥,\(O(n)\)就能求出来。
然后我们在最外层套上容斥,和20分做法一样,枚举讨论cxk的有几组就行了。
代码参见了题解,虽然不是很提倡循环的时候改变全局变量的方法,但有时候这么写是真的简便。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
#include<assert.h>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 1e3 + 5;
const ll mod = 998244353;
In int read()
{
int ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
In void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
In void MYFILE()
{
#ifndef mrclr
freopen(".in", "r", stdin);
freopen(".out", "w", stdout);
#endif
}
int n, a, b, c, d;
In ll inc(ll a, ll b) {return a + b < mod ? a + b : a + b - mod;}
ll C[maxn][maxn], sum[maxn][maxn];
In void init()
{
C[0][0] = 1;
for(int i = 1; i < maxn; ++i)
{
C[i][0] = 1;
for(int j = 1; j <= i; ++j) C[i][j] = inc(C[i - 1][j - 1], C[i - 1][j]);
}
sum[0][0] = 1;
for(int i = 0; i < maxn; ++i)
{
sum[i][0] = 1;
for(int j = 1; j < maxn; ++j) sum[i][j] = inc(sum[i][j - 1], C[i][j]);
}
}
In ll calc(int t, int L, int R)
{
if(L > R) return 0;
if(L <= 0) return sum[t][R];
return inc(sum[t][R], mod - sum[t][L - 1]);
}
int main()
{
//MYFILE();
n = read();
a = min(n, read()), b = min(n, read()), c = min(n, read()), d = min(n, read());
init();
ll ans = 0;
for(int t = 0; n >= 0 && a >= 0 && b >= 0 && c >= 0 && d >= 0; ++t)
{
ll tp = 0;
for(int i = 0; i <= n; ++i)
tp = inc(tp, C[n][i] * calc(i, i - b, i) % mod * calc(n - i, n - i - d, c) % mod);
tp = tp * C[n + t][t] % mod;
ans = inc(ans, (t & 1) ? mod - tp : tp);
n -= 4, --a, --b, --c, --d;
}
write(ans), enter;
return 0;
}
[TJOI2019]唱、跳、rap和篮球的更多相关文章
- [bzoj5510]唱跳rap和篮球
显然答案可以理解为有(不是仅有)0对情况-1对情况+2对情况-- 考虑这个怎么计算,先计算这t对情况的位置,有c(n-3t,t)种情况(可以理解为将这4个点缩为1个,然后再从中选t个位置),然后相当于 ...
- 将Android手机无线连接到Ubuntu实现唱跳Rap
您想要将Android设备连接到Ubuntu以传输文件.查看Android通知.以及从Ubuntu桌面发送短信 – 你会怎么做?将文件从手机传输到PC时不要打电话给自己:使用GSConnect就可以. ...
- [TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt
[TJOI2019]唱.跳.rap和篮球 这么多人过没人写题解啊 那我就随便说说了嗷 这题第一步挺套路的,就是题目要求不能存在balabala的时候考虑正难则反,要求必须存在的方案数然后用总数减,往往 ...
- [TJOI2019]唱、跳、rap和篮球——NTT+生成函数+容斥
题目链接: [TJOI2019]唱.跳.rap和篮球 直接求不好求,我们考虑容斥,求出至少有$i$个聚集区间的方案数$ans_{i}$,那么最终答案就是$\sum\limits_{i=0}^{n}(- ...
- [luogu5339] [TJOI2019]唱、跳、rap和篮球(容斥原理+组合数学)(不用NTT)
[luogu5339] [TJOI2019]唱.跳.rap和篮球(容斥原理+组合数学)(不用NTT) 题面 略 分析 首先考虑容斥,求出有i堆人讨论的方案. 可以用捆绑法,把每堆4个人捆绑成一组,其他 ...
- 「TJOI2019」唱、跳、rap 和篮球 题解
题意就不用讲了吧-- 鸡你太美!!! 题意: 有 \(4\) 种喜好不同的人,分别最爱唱.跳. \(rap\).篮球,他们个数分别为 \(A,B,C,D\) ,现从他们中挑选出 \(n\) 个人并进行 ...
- [TJOI2019]唱,跳,rap,篮球(生成函数,组合数学,NTT)
算是补了个万年大坑了吧. 根据 wwj 的题解(最准确),设一个方案 \(S\)(不一定合法)的鸡你太美组数为 \(w(S)\). 答案就是 \(\sum\limits_{S}[w(S)=0]\). ...
- 【题解】Luogu P5339 [TJOI2019]唱、跳、rap和篮球
原题传送门 这题zsy写的是\(O(n^2)\),还有NTT\(O(n^2\log n)\)的做法.我的是暴力,\(O(\frac{a b n}{4})\),足够通过 考虑设\(f(i)\)表示序列中 ...
- Luogu5339 [TJOI2019]唱、跳、rap和篮球 【生成函数,NTT】
当时看到这道题的时候我的脑子可能是这样的: My left brain has nothing right, and my right brain has nothing left. 总之,看到&qu ...
随机推荐
- SAS学习笔记45 宏系统选项及其他
关于宏的系统选项 MCOMPILENOTE=NONE|NOAUTOCALL|ALL 该系统选项控制是否在日志当中显示宏程序编译时的信息,默认值为NONE,也就是不显示.其中NOAUTOCALL针对的是 ...
- sonar+Jenkins 构建代码质量自动化分析平台
1.Sonar 介绍 Sonar 是一个用于管理代码质量的开源工具,可以分析代码中的bug和漏洞以及Code Smells,支持20多种编程语言的检测,如java,c/c++,python,php等语 ...
- 关于MySQL的驱动org.gjt.mm.mysql.Driver
今天看了一个比较老视频使用org.gjt.mm.mysql.Driver来驱动连接,便试了一下看看怎么样,结果一直连不上数据库,后来看了tomcat的后台发现有报这个问题,于是把驱动改成com.mys ...
- poj 2915
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> ...
- POJ1988(Cube Stacking)--并查集
题目链接:http://poj.org/problem?id=1988 题意:有n个元素,开始每个元素各自在一个栈中,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈. 第二种操作是询问 ...
- [转]Spring Security Oauth2 认证流程
1.本文介绍的认证流程范围 本文主要对从用户发起获取token的请求(/oauth/token),到请求结束返回token中间经过的几个关键点进行说明. 2.认证会用到的相关请求 注:所有请求均为po ...
- 阿里高级架构师教你如何使用Spring Cloud Ribbon重试请求
在微服务调用中,一些微服务圈可能调用失败,通过再次调用以达到系统稳定性效果,本文展示如何使用Ribbon和Spring Retry进行请求再次重试调用. 在Spring Cloud中,使用load b ...
- pip安装超时:Read timed out.
环境:win10 和 pip 在pip install h5py(或者其他第三方依赖包时) 会出现Read timed out.的问题,即安装超时.如下图所示: 解决方法: 1. 在用户目录下,新建p ...
- Js调用本地exe的方式
1. 使用记事本(或其他文本编辑器)创建一个myprotocal.reg文件,并写入以下内容 Windows Registry Editor Version 5.00 [HKEY_CLASSE ...
- AcWing 246. 区间最大公约数
246. 区间最大公约数 思路: 首先根据更相减损术,我们得到一个结论: \(gcd(a_l, a_{l+1}, ...,a_r) = gcd(a_l, a_{l+1}-a_l, a_{l+2}-a_ ...