简要题意:略。
数据范围:(1 leq n,k leq 10^9).
考虑一个事情。这玩意儿必定满足,上面方阵的集合里有的,下面没有。左边有的,右边没有;也可以都有。问题不大。
于是我们可以独立地看待各个元素的情况。
对于 (forall space [1,k] space) 的元素,很显然,每个元素,在方阵内,选择一个 “左上方的联通块” 进行覆盖,(2^n) 种是不难得到的。
于是就是 ({2^n}^k = 2^{nk}),你直接快速幂就行。
时间复杂度:(mathcal{O}(log n imes 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
",power(2,n*k));
return 0;
}