洛谷P6075 子集选取

传送门

题目描述

给定 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值