Luogu P5339 [TJOI2019]唱、跳、rap和篮球

题目
设\(f_i\)表示从\((a-4i,b-4i,c-4i,d-4i)\)中选\(n-4i\)个排队的方案数。
那么我们可以容斥,答案为\(\sum\limits_{i=0}^{lim}(-1)^i{n-3i\choose i}f_i\)。
考虑一下这个\(f\),它就是四个指数型生成函数卷起来\((\sum\limits_{i=0}^a\frac{x^i}{i!})(\sum\limits_{i=0}^b\frac{x^i}{i!})(\sum\limits_{i=0}^c\frac{x^i}{i!})(\sum\limits_{i=0}^d\frac{x^i}{i!})\)。
\(f_i\)就是\(x^i\)的系数乘上\((n-4i)!\)。
我们考虑分成两半,前面是\((\sum\limits_{i=0}^a\frac{x^i}{i!})(\sum\limits_{i=0}^b\frac{x^i}{i!})\),后面是\((\sum\limits_{i=0}^c\frac{x^i}{i!})(\sum\limits_{i=0}^d\frac{x^i}{i!})\)。
每次修改相当于\(a,b,c,d\)都减一,这样子修改是\(O(n)\)的。求某一位的值可以直接暴力卷,也是\(O(n)\)的。
所以就做到了\(O(n^2)\)。

#include<bits/stdc++.h>
using namespace std;
const int N=1007,P=998244353;
int n,a,b,c,d,inv[N],fac[N],ifac[N],f[N],g[N];
void inc(int &a,int b){a+=b,a=a>=P? a-P:a;}
void dec(int &a,int b){a-=b,a=a<0? a+P:a;}
int mul(int a,int b){return 1ll*a*b%P;}
int C(int n,int m){return mul(mul(fac[n],ifac[m]),ifac[n-m]);}
void mns(int n,int m,int *f)
{
    for(int i=0;i<=n;++i) dec(f[i+m],mul(ifac[i],ifac[m]));
    for(int i=0;i<m;++i) dec(f[i+n],mul(ifac[i],ifac[n]));
}
int cal(int n)
{
    int s=0;
    for(int i=0;i<=n;++i) inc(s,mul(f[i],g[n-i]));
    return mul(s,fac[n]);
}
int main()
{
    cin>>n>>a>>b>>c>>d;int i,j,ans=0,x;
    for(inv[1]=1,i=2;i<N;++i) inv[i]=mul(P-P/i,inv[P%i]);
    for(fac[0]=ifac[0]=i=1;i<N;++i) fac[i]=mul(fac[i-1],i),ifac[i]=mul(ifac[i-1],inv[i]);
    for(i=0;i<=a;++i) for(j=0;j<=b;++j) inc(f[i+j],mul(ifac[i],ifac[j]));
    for(i=0;i<=c;++i) for(j=0;j<=d;++j) inc(g[i+j],mul(ifac[i],ifac[j]));
    ans=cal(n);
    for(i=1;i*4<=n&&a&&b&&c&&d;++i,--a,--b,--c,--d) mns(a,b,f),mns(c,d,g),x=mul(cal(n-i*4),C(n-i*3,i)),i&1? dec(ans,x):inc(ans,x);
    printf("%d",ans);
}

原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11726915.html

时间: 2024-08-30 16:37:55

Luogu P5339 [TJOI2019]唱、跳、rap和篮球的相关文章

【题解】Luogu P5339 [TJOI2019]唱、跳、rap和篮球

原题传送门 这题zsy写的是\(O(n^2)\),还有NTT\(O(n^2\log n)\)的做法.我的是暴力,\(O(\frac{a b n}{4})\),足够通过 考虑设\(f(i)\)表示序列中至少有\(i\)组人讨论cxk的方案数 这样就珂以进行容斥,易知答案ans为: \[ans=\sum_{i=0}^{Min(n/4,a,b,c,d)} (-1)^i f(i)\] 我们考虑如何计算\(f(i)\) 如果视讨论cxk的组为一个元素,则一共有\(n-3*i\)个元素 我们把问题转换成一个

[TJOI2019]唱、跳、rap和篮球——NTT+生成函数+容斥

题目链接: [TJOI2019]唱.跳.rap和篮球 直接求不好求,我们考虑容斥,求出至少有$i$个聚集区间的方案数$ans_{i}$,那么最终答案就是$\sum\limits_{i=0}^{n}(-1)^i\ ans_{i}$ 那么现在只需要考虑至少有$i$个聚集区间的方案数,我们枚举这$i$个区间的起始点位置,一共有$C_{n-3i}^{i}$种方案(可以看作是刚开始先将每个区间后三个位置去掉,从剩下$n-3i$个位置中选出$i$个区间起点,然后再在每个起点后面加上三个位置). 那么剩下的$

[luogu5339] [TJOI2019]唱、跳、rap和篮球(容斥原理+组合数学)(不用NTT)

[luogu5339] [TJOI2019]唱.跳.rap和篮球(容斥原理+组合数学)(不用NTT) 题面 略 分析 首先考虑容斥,求出有i堆人讨论的方案. 可以用捆绑法,把每堆4个人捆绑成一组,其他人每个人一组.这样一共有\(n-3i\)组(这些组可以被看成相同的点). 我们从中选出n-4i个点,这些点展开成1个人,其他\(i\)个点展开成4个人.那么方案数就是\(C_{n-3i}^{n-4i}\) 由于\(i\)堆人的喜好已经确定,最终答案为\(\sum_{i=0}^n (-1)^i \ti

唱、跳、rap和篮球

唱.跳.rap和篮球 大中锋的学院要组织学生参观博物馆,要求学生们在博物馆中排成一队进行参观.他的同学可以分为四类:一部分最喜欢唱.一部分最喜欢跳.一部分最喜欢rap,还有一部分最喜欢篮球.如果队列中\(k,k + 1,k+1,k + 2,k+2,k + 3,k+3\)位置上的同学依次,最喜欢唱.最喜欢跳.最喜欢rap.最喜欢篮球,那么他们就会聚在一起讨论蔡徐坤.大中锋不希望这种事情发生,因为这会使得队伍显得很乱.大中锋想知道有多少种排队的方法,不会有学生聚在一起讨论蔡徐坤.两个学生队伍被认为是

[TJOI2019]唱、跳、rap和篮球

题目 套路题啊 发现正向计数不太好记,考虑容斥 考虑求至少有\(i\)段连续四个位置是不合法的,容斥系数显然是\((-1)^i\) 我们先选出这样的\(i\)段长度为\(4\)的区间来 我们考虑分配一下空格,问题就等价于把\(n-4i\)个空格分到\(i+1\)组里,插板一下就能知道答案是\(\binom{n-3i}{i}\) 考虑剩下的\(n-4i\)个空格,我们现在需要把这些空格填满 先来考虑一下这四种分别填了\(a,b,c,d\)个方案数是多少 这\(n-4i\)个位置直接去排列,是\((

[TJOI2019]唱、跳、rap和篮球——容斥原理+生成函数

先附一组sd图 然后放上原题链接 注意,队伍不同指的是喜好不同,不是人不同 先想到\(DP\),然后你会发现并没有什么优秀的状态设计,然后我们考虑容斥 设\(lim\)表示选的癌坤组数的上限,\(f_i\)为先选出来\(i\)组剩下随便排的方案数,那么答案就是 \[\sum\limits_{i=0}^{lim}(-1)^i\times\ f_i\] 于是问题转化为了求\(f_i\).显然\(f_i\)可以表示为一个组合数再乘一个东西,具体来说组合数代表在\(n\)个同学中选\(i\)组癌坤的方案

[TJOI2019]唱,跳,rap,篮球(生成函数,组合数学,NTT)

算是补了个万年大坑了吧. 根据 wwj 的题解(最准确),设一个方案 \(S\)(不一定合法)的鸡你太美组数为 \(w(S)\). 答案就是 \(\sum\limits_{S}[w(S)=0]\). 用二项式定理:\(\sum\limits_{S}[w(S)=0]=\sum\limits_{S}(1-1)^{w(S)}=\sum\limits_{S}\sum\limits_{i\ge 0}(-1)^i\binom{w(S)}{i}=\sum\limits_{i\ge 0}(-1)^i\sum\l

luogu P5338 [TJOI2019]甲苯先生的滚榜

传送门 首先,排名系统,一看就知道是原题,可以上平衡树来维护 然后考虑一种比较朴素的想法,因为我们要知道排名在一个人前面的人数,也就是AC数比他多的人数+AC数一样并且罚时少的人数,所以考虑维护那两个东西.AC数更多的人数显然可以直接上树状数组.后者的话可以对每一种AC数开值域线段树,存每个罚时有多少人,注意到罚时之和不会超过\(1.5*10^6\),所以动态开点线段树可以轻松解决.然后每次有个人AC数和罚时改变就先在原来的位置-1,然后在新位置+1.每次询问就是树状数组上AC数\(>\)当前A

【题解】Luogu P5342 [TJOI2019]甲苯先生的线段树

原题传送门 挺有趣的一道题 \(c=1\),暴力求出点权和n即可 \(c=2\),先像\(c=1\)一样暴力求出点权和n,考虑有多少路径点权和也为n 考虑设x为路径的转折点,\(L\)为\(x\)向左儿子走的长度,\(R\)为\(x\)向右儿子走的长度.易知当\(L,R\)确定时,有唯一的\(x\)对应 以\(x\)为转折点,\(L,R\)为向左/右儿子走的距离,这时点权和至少为\(Min=(2^{L+1}+2^{R+1}-3)x+2^R-1\) 此时x的取值一定珂以求出.考虑一下如何产生剩下\