题目描述
给定 nn 个元素的集合 S= \left{ \ 1,2…n \right}S={ 1,2…n} 和整数kk,现在要从SS 中选出若干子集 A_{i,j}A
i,j
(A \subseteq SA⊆S,1 \le j \le i \le k1≤j≤i≤k)排成下面所示边长为 kk 的三角形(因此总共选出了 \frac{1}{2} k(k+1)
2
1
k(k+1) 个子集)。
\begin{matrix} A_{1,1}\ A_{2,1}&A_{2,2}\ A_{3,1}&A_{3,2}&A_{3,3}\ \vdots&\vdots&\vdots&\ddots\ A_{k,1}&A_{k,2}&A_{k,3}&\cdots&A_{k,k} \end{matrix}
A
1,1
A
2,1
A
3,1
⋮
A
k,1
A
2,2
A
3,2
⋮
A
k,2
A
3,3
⋮
A
k,3
⋱
⋯
A
k,k
此外,JYY 对选出的子集之间还有额外的要求:选出的这些子集必须满足 A_{i,j} \subseteq A_{i,j-1}A
i,j
⊆A
i,j−1
且 A_{i,j} \subseteq A_{i-1,j}A
i,j
⊆A
i−1,j
。
JYY 想知道,求有多少种不同的选取这些子集的方法。因为答案很大,JYY 只关心输出答案模 1,000,000,0071,000,000,007 的值。
对于两种选取方案 A = \left{ \ A_{1,1} , A_{2,1} , A_{k,k} \right}A={ A
1,1
,A
2,1
,A
k,k
} 和 B = \left{ \ B_{1,1} , B_{2,1} , B_{k,k} \right}B={ B
1,1
,B
2,1
,B
k,k
} 只要存在 i,ji,j 满足 A_{i,j} \neq B_{i,j}A
i,j
=B
i,j
,我们就认为 AA 和 BB 是不同的方案。
输入格式
输入包含一行两个整数 nn 和 kk。
输出格式
一行一个整数,表示不同方案数目模 1,000,000,0071,000,000,007 的值。
输入输出样例
输入 #1复制
2 2
输出 #1复制
16
说明/提示
对于 100%100% 的数据,1 \le n1≤n,k \le 10^9k≤10
9
。
上代码:
#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;
}