CF Gym103415D Unnamed Easy Problem
Description
计算满足下列条件的 矩阵的数量:
-
每行后 列至少有一个
-
每行互不相同
-
列共有奇数个 , 列共有奇数个
-
行之间无序
Solution
先不考虑最后一个限制,最后除以 来无序化
奇偶性的限制可以使用烂大街的套路:最后一行来抵消前面行的奇偶性需求,前面的行任意选
那么需要处理此时不满足第一和第二条限制的问题,将不合法方案数减去
设 表示行数为 时的答案, 表示行数为 且不一定满足限制 时的答案
前者转移可以用 减掉出现相同的情况数 再减掉不满足最后一行后 列至少有 个 的方案数
那么非常精彩地,现在最后一行的后 列没有任何 了,前 行的后 列奇偶性已经满足,所以这是
后者的转移由于不考虑前 列的合法性,所以总方案数要附加最后一行前 列乱选的 的系数,出现相同还是
不满足有 的部分也是符合 的定义,但是由于最后一行前 列可以乱选,那么也要附上 作为系数
时间复杂度
Code
const int N=1e6+10;
int f[N],g[N];
int n,m,k,oee,oez;
signed main(){
n=read(); k=read(); m=read();
oee=read(),oez=read();
int s=ksm(2,k),tot=del(ksm(2,n),ksm(2,k));
int fac=1,P=1;
f[0]=!oez&&!oee;
g[0]=(bool)!oez;
f[1]=(bool)oez;
g[1]=f[1]*s;
for(int i=2;i<=m;++i){
int cho=del(tot,i-2);
ckmul(P,cho);
ckmul(fac,i);
f[i]=del(P,g[i-1]);
ckdel(f[i],mul(i-1,mul(f[i-2],cho)));
g[i]=mul(s,del(P,g[i-1]));
ckdel(g[i],mul(i-1,mul(g[i-2],cho)));
}
print(mul(f[m],ksm(fac,mod-2)));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律