首页 > 其他分享 >[ARC096E] Everything on It 题解

[ARC096E] Everything on It 题解

时间:2024-09-16 15:50:47浏览次数:12  
标签:ch limits int 题解 sum 个数 Everything ARC096E binom

题目链接

点击打开链接

题目解法

肯定考虑容斥
钦定有 \(a\) 个数出现 \(0\) 次,有 \(b\) 个数出现恰好 \(1\) 次,其他 \(n-a-b\) 个数随便,容斥系数为 \((-1)^{a+b}\)
先给出方案数的表达式:\(\sum\limits_{a=0}^n\sum\limits_{b=0}^{n-a}(-1)^{a+b}2^{2^{n-a-b}}\binom{n}{a}\binom{n-a}{b}\sum\limits_{c=0}^b {b \brace c}(2^{n-a-b})^c\)
\(\binom{n}{a}\binom{n-a}{b}\) 是 \(n\) 个数分成大小为 \(a,b,n-a-b\) 的堆的方案数
\(2^{2^{n-a-b}}\) 是放任自流的数集任意选
\(c\) 是在枚举那 \(b\) 个数出现在多少个集合中
\({b \brace c}\) 是第二类斯特林数,即 \(b\) 个数分成 \(c\) 的无序集合的方案数
\((2^{n-a-b})^c\) 是指那 \(c\) 个集合可以配上一些放任自流的数的方案数

这样做是 \(O(n^3)\) 的
观察到 \(a+b\) 较为独立,考虑转而枚举 \(s=a+b\)
\(ans=\sum\limits_{s=0}^n(-1)^s 2^{2^{n-s}}\binom{n}{s}\sum\limits_{c=0}^s(2^{n-s})^c\sum\limits_{b=c}^s\binom{s}{b}{b\brace c}\)
从组合意义考虑 \(\sum\limits_{b=c}^s\binom{s}{b}{b\brace c}\)
从 \(n\) 个数中选 \(b\) 个数,放入 \(c\) 的集合(都不能为空)等价于 有 \(n+1\) 个数,放入 \(c+1\) 个集合,最后一个集合代表不选的方案数
这样可以优化到 \(O(n^2)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=3010;
int n,P;
int C[N][N],pw2[N],s2[N][N],PW2[N*N];
int qmi(int x,int y){
    int res=1;for(;y;y>>=1){ if(y&1) res=1ll*res*x%P;x=1ll*x*x%P;}
    return res;
}
inline void inc(int &x,int y){ x+=y;if(x>=P) x-=P;}
inline void dec(int &x,int y){ x-=y;if(x<0) x+=P;}
int main(){
    read(n),read(P);
    F(i,0,n){
        C[i][0]=C[i][i]=1;
        F(j,1,i-1) C[i][j]=(C[i-1][j]+C[i-1][j-1])%P;
    }
    s2[0][0]=1;
    F(i,1,n+1) F(j,1,i) s2[i][j]=(s2[i-1][j-1]+1ll*s2[i-1][j]*j)%P;
    pw2[0]=1;
    F(i,1,n) pw2[i]=pw2[i-1]*2%(P-1);
    PW2[0]=1;
    F(i,1,n*n) PW2[i]=PW2[i-1]*2%P;
    int ans=0;
    F(s,0,n){
        int t=qmi(2,pw2[n-s]);
        F(c,0,s){
            int wys=1ll*C[n][s]*t%P*PW2[(n-s)*c]%P*s2[s+1][c+1]%P;
            if(s&1) dec(ans,wys);
            else inc(ans,wys);
        }
    }
    printf("%d\n",ans);
    return 0;
}

标签:ch,limits,int,题解,sum,个数,Everything,ARC096E,binom
From: https://www.cnblogs.com/Farmer-djx/p/18416354

相关文章

  • 图:310.最小高度数, 题解
    310.最小高度树-力扣(LeetCode)参考题解:算法逻辑:算法的核心思路是逐层剪去叶子节点,直到剩下的节点是最小高度树的根。示例:假设有如下的树结构:0/\12/\34初始时,叶子节点是1、3和4,剪掉这些叶子节点后,树变成:0\2再次剪掉......
  • 【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)
    [USACO1.5][IOI1994]数字三角形NumberTriangles题目描述观察下面的数字金字塔。写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。在上面的样例中,从的路径产生了最大权值。输入格式第一个行一个正整数......
  • 题解:P9938 [USACO21OPEN] Acowdemia II B
    首先根据每篇出版物构建一个资历比较矩阵\(g\),其中\(g_{a,b}=1\)表示研究员\(a\)比\(b\)资历更高。遍历每篇出版物,识别出第一个降序的名字,然后假定该名字之后的所有研究员资历都比当前名字对应的研究员资历高即可。代码:#include<bits/stdc++.h>usingnamespacestd;......
  • 题解:P9951 [USACO20FEB] Swapity Swap B
    奶牛的排列经过\(x\)次后会回到原来的位置,理解以下:\([a_1,a_2]\)的牛翻转两次就会回到原来的位置,\([b_1,b_2]\)的牛翻转两次也会回到原来的位置,所以原来奶牛的排列经过一定次数的旋转后一定会回到原来位置。我们只要先模拟得出多少次后第\(i\)位的奶牛会回到原来的位置,然后......
  • 题解:P9953 [USACO20OPEN] Social Distancing II B
    解决思路:根据奶牛的位置对数组进行排序。计算相邻健康奶牛和感染奶牛之间的最小距离。这个距离值减一用来估计感染传播的半径。(确保了感染奶牛之间的距离在当前半径下不会导致传播给其他健康奶牛。)遍历排序后的奶牛列表,找到每一段连续感染奶牛的区域,并计算这些区域中可能需要的......
  • 区间检测题解
    记录\(pre_i\)为\(a_i\)上一次出现的位置。每一次求\([L,R]\)范围内是否有相同的数即\(pre_L\)到\(pre_R\)中的最大值是否小于\(L\)。注意到\(pre_1\)到\(pre_{L-1}\)中最大数一定小于\(L\),所以求\([L,R]\)范围内是否有相同的数即\(pre_1\)到\(pre_R\)中的......
  • 题解:P9957 [USACO20DEC] Stuck in a Rut B
    由于\(x,y\leq10^9\),我们无法模拟每个时间段。因此,我们需要尝试判断两头牛何时会相交。一个重要的观察是,牛不能后退,所以两头牛发生碰撞的唯一方式是\(n[x]>e[x]\)且\(n[y]<e[y]\)。可以按牛的起始坐标进行排序,然后模拟这些碰撞。代码:#include<bits/stdc++.h>using......
  • 题解:P3113 [USACO14DEC] Marathon G
    用线段树维护子路径的长度和这条子路径上删除一个点能够减少的最大距离。那么,修改就修改线段树上对应位置的值,查询就求这一段子路径的距离和子路径上删除一个点能够减少的最大距离,两者相减即可得到答案。代码:#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,in......
  • 题解:P10961 划分大理石
    设\(f_x\)表示拼成\(x\)后,当前的大理石最多还能剩下几块,不能拼成就是\(-1\)。状态转移(当前考虑的大理石价值为\(i\),有\(x\)块):\(f_j=x(f_j\ge0)\)本来就可以拼成,那么现在的大理石都可以剩下。\(f_j=f_{j-i}-1(f_j=-1,j\gei,f_{j-i}>0)\)本来不能拼成,但用了一块就能拼......
  • AGC026D Histogram Coloring 题解
    [AGC026D]HistogramColoring题解给定\(n\)列的网格,每列高为\(h_i\),将每个格子染色成红色或蓝色,使得每个\(2\times2\)的区域都恰好有两个蓝格子和两个红格子,求方案数(对\(10^9+7\)取模)。\(1\leqn\leq100,1\leqh_i\leq10^9\)性质为了方便讲述,先假设\(h_i=h_{i+......