[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 \times C_{n-3i}^{n-4i} \times (n-4i个单独的人的喜好方案数)\)

那么我们就需要求n-4i个单独的人的喜好方案数。每种喜好的人各有\(a-i,b-i,c-i,d-i\)。假如这些人里每种喜好的人各有\(x,y,z,w(x \leq a-i,y \leq b-i,z \leq c-i,w \leq d-i,x+y+z+w=n-4i)\)个。这是一个有重复元素的排列问题。答案是\(\frac{(n-4i)!}{x!y!z!w!}\)

直接枚举的时间复杂度为\(O(k^4)\),(\(k=\min(a,b,c,d)\)),下同。显然会超时。我们可以用折半搜索的思想,先枚举前两个的个数\(x,y\),把\(\frac{1}{x!y!}\)的和记录在\(cnt[x+y]\)中。然后枚举\(z,w\),只要每次答案累加上\(z!\times w! \times cnt[n-4i-(z+w)]\)即可。时间复杂度\(O(k^2)\)

总时间复杂度\(O(nk^2)\)

代码

//鸡你太美!
#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 998244353
#define maxn 1000
using namespace std;
typedef long long ll;
inline ll fast_pow(ll x,ll k){
ll ans=1;
while(k){
if(k&1) ans=ans*x%mod;
x=x*x%mod;
k>>=1;
}
return ans;
}
inline ll inv(ll x){
return fast_pow(x,mod-2);
}
int n,a,b,c,d;
ll fact[maxn+5],invfact[maxn+5]; void ini(){
fact[0]=1;
for(int i=1;i<=n;i++) fact[i]=fact[i-1]*i%mod;
invfact[n]=inv(fact[n]);
for(int i=n-1;i>=0;i--) invfact[i]=invfact[i+1]*(i+1)%mod;
} inline ll C(ll n,ll m){
return fact[n]*invfact[n-m]%mod*invfact[m]%mod;
} ll cnt[maxn+5];
int main(){
scanf("%d",&n);
scanf("%d %d %d %d",&a,&b,&c,&d);
ini();
int mx=min(min(a,b),min(c,d));
ll ans=0;
for(int i=0;i<=n/4&&i<=mx;i++){
memset(cnt,0,sizeof(cnt));
//可重排列((a+b+c+d)!)(a!b!c!d!)
//类似中途相遇分两半求解
for(int j=0;j<=a-i;j++){
for(int k=0;k<=b-i;k++){
cnt[j+k]=(cnt[j+k]+invfact[j]*invfact[k]%mod)%mod;
}
}
ll sum=0;
for(int j=0;j<=c-i;j++){
for(int k=0;k<=d-i&&j+k<=n-4*i;k++){
sum=(sum+cnt[n-4*i-(j+k)]*invfact[j]%mod*invfact[k]%mod)%mod;
}
}
sum=sum*fact[n-4*i]%mod; //捆绑法,把4个一组的捆绑成1个,共n-3i个
//再从中选出n-4i个单独1个的,其他展开
//C(n-3i,n-4i)
ans+=fast_pow(-1,i)*C(n-3*i,n-4*i)*sum%mod;
ans=(ans+mod)%mod;
}
printf("%lld\n",ans);
}

[luogu5339] [TJOI2019]唱、跳、rap和篮球(容斥原理+组合数学)(不用NTT)的更多相关文章

  1. [bzoj5510]唱跳rap和篮球

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

  2. Luogu5339 [TJOI2019]唱、跳、rap和篮球 【生成函数,NTT】

    当时看到这道题的时候我的脑子可能是这样的: My left brain has nothing right, and my right brain has nothing left. 总之,看到&qu ...

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

    先附一组sd图 然后放上原题链接 注意,队伍不同指的是喜好不同,不是人不同 先想到\(DP\),然后你会发现并没有什么优秀的状态设计,然后我们考虑容斥 设\(lim\)表示选的癌坤组数的上限,\(f_ ...

  4. [LOJ3106][TJOI2019]唱、跳、rap和篮球:DP+生成函数+NTT+容斥原理

    分析 令\(f(i)\)表示共\(i\)组同学讨论cxk的位置的方案数(不考虑其他位置上的人的爱好),这个数组可以很容易地通过依次考虑每个位置是否是四个人中最后一个人的位置来递推求解,时间复杂度\(O ...

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

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

  6. [TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt

    [TJOI2019]唱.跳.rap和篮球 这么多人过没人写题解啊 那我就随便说说了嗷 这题第一步挺套路的,就是题目要求不能存在balabala的时候考虑正难则反,要求必须存在的方案数然后用总数减,往往 ...

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

    题目链接: [TJOI2019]唱.跳.rap和篮球 直接求不好求,我们考虑容斥,求出至少有$i$个聚集区间的方案数$ans_{i}$,那么最终答案就是$\sum\limits_{i=0}^{n}(- ...

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

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

  9. 【bzoj4710】[Jsoi2011]分特产 容斥原理+组合数学

    题目描述 JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因 ...

随机推荐

  1. Git远程新建分支之后,本地看不到最新分支

    git remote update origin –prune 注意 双- csdn 对于 两个 - 看起来像一个

  2. maven 三个仓库表

    https://search.maven.org ,http://www.mvnrepository.com/ http://maven.apache.org

  3. 兄弟连教育分享-SQL性能优化十条经验

    1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'——红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 兄弟连教育分享-SQL性能优化十条经验 解决办法: 其 ...

  4. Linux下cs简单通讯(socket)

    Server: #include<iostream> #include<sys/types.h> #include<sys/socket.h> #include&l ...

  5. Tarjan算法初步

    一.前置知识: 强连通分量:有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(stron ...

  6. 测试String——StringBuffer——StringBulider的速度

    package comnf147Package; import java.util.ArrayList; import java.util.List; public class String_Test ...

  7. 获取免费的https证书

    可以通过网站获取免费的https证书 首先到https://freessl.org注册一个账号 然后就可以开始创建免费证书了 获取的证书里面通常只有pem后缀文件 nodejs使用的时候需要crt文件 ...

  8. RF通过命令执行用例及自定义报告与日志的位置

    1.执行整个项目下的所有用例: pybot 项目路径.例如: pybot D:\robotPS:robot项目里面所有用例 2.执行某个suit中的所有用例: pybot 项目路径\suit文件名称. ...

  9. zay大爷的神仙题目 D1T2-腐草为萤

    题面如下 依照旧例放外链 [题目背景] 纤弱的淤泥中妖冶颓废在季夏第三月最幼嫩的新叶连凋零都不屑何必生离死别——银临<腐草为萤> [问题描述] 扶苏给了你一棵树,这棵树上长满了幼嫩的新叶, ...

  10. python编译报错

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3 in position 3:ordi 因为同时安装了python2和python3,所 ...