Description
Analysis
设 F(n,k) 表示读入n,k的答案
First step
考虑到每个元素之间其实是互相独立的,所以
F(n,k)=F(1,k)n
我们只需快速求出
F(1,k)
Second step
这是一个三角形
A[i]
表示第i列最后一个1的行(该行以上全为1,以下全为0)
显然有
A[i]>=A[i+1]
设
G[i][j]
表示第i行,最后一个1的行为j的方案数,则
G[i][j]=∑kp=jG[i−1][p]=G[i−1][j]+G[i][j+1]
这便是组合数的形式
写出来,发现其实是倒放的杨辉三角
G[i,j]
1
14
136
1234
11111
因为可以在任意一个位置结束,也可以全不选,所以
F(1,k)=1+∑G[i][j]=2k
所以 Ans=2nk
Code
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=11,mo=1e9+7;
ll n,k;
ll qmi(ll x,ll n)
{
ll t=1;
for(;n;n>>=1)
{
if(n&1) t=t*x%mo;
x=x*x%mo;
}
return t;
}
int main()
{
freopen("subset.in","r",stdin);
freopen("subset.out","w",stdout);
scanf("%lld %lld",&n,&k);
printf("%lld\n",qmi(2,n*k));
return 0;
}