题解 P6075 【[JSOI2015]子集选取】

CSDN同步

原题链接

简要题意:略。

数据范围:\(1 \leq n,k \leq 10^9\).

考虑一个事情。这玩意儿必定满足,上面方阵的集合里有的,下面没有。左边有的,右边没有;也可以都有。问题不大。

于是我们可以独立地看待各个元素的情况。

对于 \(\forall \space [1,k] \space\) 的元素,很显然,每个元素,在方阵内,选择一个 “左上方的联通块” 进行覆盖,\(2^n\) 种是不难得到的。

于是就是 \({2^n}^k = 2^{nk}\),你直接快速幂就行。

时间复杂度:\(\mathcal{O}(\log n \times \log k)\)

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

inline ll read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
	ll x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}

ll n,k;
const ll MOD=1e9+7;

inline ll power(ll x,ll y) {
	ll ans=1;
	while(y) {
		if(y&1) ans=(ans*x)%MOD;
		x=(x*x)%MOD; y>>=1;
	} return ans;
}

int main(){
	n=read(),k=read();
	printf("%lld\n",power(2,n*k));
	return 0;
}

posted @ 2021-01-23 22:08  bifanwen  阅读(83)  评论(0编辑  收藏  举报