题解 P6075 【[JSOI2015]子集选取】
简要题意:略。
数据范围:\(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;
}
简易的代码胜过复杂的说教。