把集合看成一个
n
位二进制数,第
在一个边长为
可以得到,最后结果等于上面问题结果的
对于这个问题,考虑一个DP的做法,设
f[i]
为到了第
i
行的方案数。
转移的方法是枚举
可以得到,第
f[i]=1+∑i−1j=0f[i−j−1]
也就是
f[i]=1+∑i−1j=0f[j]
。
由于
f[0]=1
,因此归纳得出
f[k]=2k
。
所以答案
=2nk
。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int PYZ = 1e9 + 7;
int n, K;
int qpow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = 1ll * res * a % PYZ;
a = 1ll * a * a % PYZ;
b >>= 1;
}
return res;
}
int main() {
cin >> n >> K;
cout << qpow(2, 1ll * n * K % (PYZ - 1)) << endl;
return 0;
}