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 imes 5)的三角矩阵
(0表示该集合没有这个元素,1表示有)
注意到虚线所描出来的轮廓,对于一个(n imes 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
",fpow(2,1ll*n*m%(P-1)));
return 0;
}