[CTS2019]随机立方体(容斥+组合数学)

这题七次方做法显然,但由于我太菜了,想了一会发现也就只会这么多,而且别的毫无头绪。发现直接做不行,那么,容斥!

f[i]为至少i个极值的方案,然后这里需要一些辅助变量,a[i]表示选出i个三维坐标均不相同的i个极大值的方案数,g[i]表示i个极大的数任意一个至少有一维坐标相同的点的个数,h[i]表示g[i]的极值可以同时存在的方案数,那么有f[i]=C(nml,g[i])a[i]h[i](nml-g[i])!。

a[i]很容易求得,就是(∏(n-j)(m-j)(l-j))/i!,其中j∈[0,i),g[i]更好求,就是nml-(n-i)(m-i)(l-i)

然后要进行一些关于上升幂的运算,我这里打不出式子(因为太菜了不会LaTeX),所以就不打了。注意维护g[i]的前缀积,具体细节看code吧。

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+7,mod=998244353;
int n,m,l,k,mn,ans,fac[N],inv[N],a[N],f[N],g[N],h[N],pre[N];
int calc(int x){return 1ll*(n-x)*(m-x)%mod*(l-x)%mod;}
int qpow(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1)ret=1ll*ret*a%mod;
        a=1ll*a*a%mod,b>>=1;
    }
    return ret;
}
int C(int a,int b){return 1ll*fac[a]*inv[b]%mod*inv[a-b]%mod;}
int main()
{
    inv[0]=inv[1]=fac[0]=1;for(int i=2;i<N;i++)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
    for(int i=1;i<N;i++)fac[i]=1ll*fac[i-1]*i%mod,inv[i]=1ll*inv[i-1]*inv[i]%mod;
    int T;scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d",&n,&m,&l,&k);
        mn=min(n,min(m,l));
        a[0]=h[0]=pre[0]=1;
        for(int i=1;i<=mn;i++)a[i]=1ll*a[i-1]*calc(i-1)%mod;
        for(int i=1;i<=mn;i++)g[i]=(1ll*g[i-1]+calc(i-1)-calc(i)+mod)%mod;
        for(int i=1;i<=mn;i++)pre[i]=1ll*pre[i-1]*g[i]%mod;
        pre[mn]=qpow(pre[mn],mod-2);
        for(int i=mn;i;i--)pre[i-1]=1ll*pre[i]*g[i]%mod;
        for(int i=1;i<=mn;i++)f[i]=1ll*a[i]*pre[i]%mod;
        ans=0;
        for(int i=k;i<=mn;i++)
        if((i-k)&1)ans=(ans-1ll*C(i,k)*f[i]%mod+mod)%mod;
        else ans=(ans+1ll*C(i,k)*f[i])%mod;
        printf("%d\n",ans);
    }
}

原文地址:https://www.cnblogs.com/hfctf0210/p/10896868.html

时间: 2024-11-09 00:13:57

[CTS2019]随机立方体(容斥+组合数学)的相关文章

【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学

[BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数.如果在每门课上A获得的成绩均小于等于B获得的成绩,则称A被B碾压.在B神的说法中,G系共有K位同学被他碾压(不包括他自己),而其他N-K-1位同学则没有被他碾压.D神查到了B神每门必修课的排名.这里的排名是指:如果B神某门课的排名为R,则表示有且

hdu - 4790 - Just Random(容斥 + 组合数学)

题意:在 [a, b] 取一个整数 x,在 [c, d] 取一个整数 y,求满足 (x + y) % p = m 的 (x, y) 的对数(0 <= a <= b <= 10 ^ 9, 0 <=c <= d <= 10 ^ 9, 0 <= m < p <= 10 ^ 9). 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4790 -->>2013年成都区赛最后一题,当时TLE6次无果....加

CF 317 A. Lengthening Sticks(容斥+组合数学)

传送门:点我 A. Lengthening Sticks time limit per test 1 second You are given three sticks with positive integer lengths of a, b, and c centimeters. You can increase length of some of them by some positive integer number of centimeters (different sticks ca

HDU 5155 Harry And Magic Box(组合数学+容斥)

Problem Description One day, Harry got a magical box. The box is made of n*m grids. There are sparking jewel in some grids. But the top and bottom of the box is locked by amazing magic, so Harry can't see the inside from the top or bottom. However, f

UVA 11806 组合数学+容斥

UVA: https://vjudge.net/problem/UVA-11806 题意:给你一个n×mn×m的矩阵网格和kk个人,问有多少种方法使得每一个格子只放一个人,并且第一行,最后一行,第一列,最后一列都有人.直接枚举似乎有难度,我们考虑容斥.rr行cc列放kk个人的方案数是(r×ck)(r×ck),那么由容斥原理,总方案为 ans=U?A?B?C?D+AB+AC+AD+-+ABCDans=U?A?B?C?D+AB+AC+AD+-+ABCD 其中UU表示没有限制的方案数,A,B,C,DA

【BZOJ2969】矩形粉刷 概率+容斥

[BZOJ2969]矩形粉刷 Description 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩形全部刷好.小M乐坏了,于是开始胡乱地使用这个工具. 假设小M每次选的两个格子都是完全随机的(方阵中每个格子被选中的概率是相等的),而且小M使用了K次工具,求木板上被小M粉刷过的格子个数的期望值是多少. Input 第一行是整数K,W,H Output 一

cf451E Devu and Flowers 卢卡斯定理+容斥定理

题目:http://codeforces.com/problemset/problem/451/E 题意:有n个盒子(n<=20),每个盒子中有10^12个小球,现从每个盒子中取出若干球(可为0),求共取出s个小球(s<=10^14)的方案数. 组合数学问题,求C(n,m).但n,m过大时,可用卢卡斯定理. 卢卡斯定理:C(n,m) %p = C(n/p,m/p) * C(n%p,m%p) 从n个盒子中取出s个球的方案数,相当于插板,即 C(s+n-1,n-1).注意这是没有限制条件的情况.

【洛谷U20626】gemo 容斥 FWT 高斯消元

题目大意 给你一个无向图,有\(m\)个询问,每次给你一个点\(x\)和一个点集\(S\),问你从\(x\)开始走,每次从一个点随机的走到与这个点相邻的点,问你访问\(S\)中每个点至少一次的期望步数是多少. \(n\leq 18,m\leq 100000\) 题解 有个东西叫min-max容斥: \[ \max(S)=\sum_{T\subseteq S}{(-1)}^{|T|+1}\min(T) \] 这道题中,\(\min(S)\)是从点\(x\)开始走,走到\(S\)中任意一个点的期望步

min_max容斥

min_max容斥 用途 对于一个集合S,给出每个元素出现的概率,我们需要求每一个元素都出现至少一次的期望次数,可以使用min_max容斥. 例题 HDU-4336 Card Collector 这题当然可以状压dp,注意可能随机到本身有的元素的情况即可.时间复杂度\(O(2^n*n)\),空间复杂度\(O(2^n)\) 但是,用以下方法时空效率都会更高,时间复杂度\(O(2^n)\),空间复杂度是\(O(n)\)的,并且非常好写. 定义 对于一个集合S \(min(S)\)表示这个集合第一个出