首页 > Web开发 > 详细

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

时间:2020-02-11 15:44:19      阅读:51      评论:0      收藏:0      [点我收藏+]

传送门

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

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

为啥呢?

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

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

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

技术分享图片

(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;
}

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

原文:https://www.cnblogs.com/wxq1229/p/12295145.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!