这题是个容斥。
总情况有2^(nk)中,但是其中包含了1个重复元素,2个,3个。。
用容斥,1个重复元素加上,2个减去,3个加上
这样推出公式为
C(n, 0)2^(nk) - C(n, 1)2^((n -1)k) + C(n, 2)2^((n - 2)k)......
==> (2^k - 1)^n
快速幂取模计算即可
代码:
#include <cstdio>
#include <cstring>
typedef long long ll;
const int MOD = 1000000007;
int pow_mod(int x, int k) {
int ans = 1;
while (k) {
if (k&1) ans = (ll)ans * x % MOD;
x = (ll)x * x % MOD;
k >>= 1;
}
return ans;
}
int n, k;
int main() {
while (~scanf("%d%d", &n, &k)) {
printf("%d\n", pow_mod((pow_mod(2, k) - 1 + MOD) % MOD, n));
}
return 0;
}