传送门

ps: 下面\(n\)和\(k\)好像和题目里的写反了。。。将就着看吧\(qwq\)

暴力打个表答案就出来了?

先写个结论,答案就是\(2^{nk}\)。

为啥呢?

首先你需要知道,因为一个集合是另一个集合的子集这个东西,集合中的一个元素对其他元素并不会有影响,完全可以把元素分开来看,然后将答案乘起来。

那么转化成一个好像好解决点的问题,就是\(k = 1\)时怎么做。

因为只有一个元素,在加上要求是\(A_{i,j} \subseteq A_{i-1,j},A_{i,j} \subseteq A_{i,j-1}\),所以这个三角矩阵一定是上面一部分有这个元素,而下面一部分没有,比方说两个用一个元素构成的满足要求的\(5 \times 5\)的三角矩阵

[题解] LuoguP6075 [JSOI2015]子集选取-LMLPHP

(0表示该集合没有这个元素,1表示有)

注意到虚线所描出来的轮廓,对于一个\(n \times n\)的三角矩阵,只有一个元素的方案数就是从左下角那个点走\(n\)步,每一步只能向上或向有走的方案数,因为这样走出的路径一定是一个合法的轮廓,轮廓的上面就代表有该元素,下面就没有。

那么这样的方案数就是\(2^n\)。

因为有\(k\)种元素,所以乘起来就是\(2^{nk}\)

快速幂算一下就好了。

\(Code:\)

#include <bits/stdc++.h>
using namespace std;
const int P=1e9+7;
inline int fpow(int x,int y){
int ret=1; for(x%=P;y;y>>=1,x=1ll*x*x%P)
if(y&1) ret=1ll*ret*x%P;
return ret;
}
int main(){
int n,m; scanf("%d%d",&n,&m);
printf("%d\n",fpow(2,1ll*n*m%(P-1)));
return 0;
}
05-11 19:56