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

传送门

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;
}
原文地址:https://www.cnblogs.com/wxq1229/p/12295145.html