BZOJ4475: [Jsoi2015]子集选取【找规律】【数学】
Description
Input
输入包含一行两个整数N和K,1<=N,K<=10^9
Output
一行一个整数,表示不同方案数目模1,000,000,007的值。
Sample Input
2 2
Sample Output
16
思路
首先因为每个元素都是独立的,所以可以分开考虑
然后如果只有一个元素,可以考虑\(dp_{i}\)表示i行i列的方案数
第i+1行如果放了前k个,那么前面的前k个都必须要放,所以只剩下一个\(dp_{i-1-k}\)
然后归纳一下发现就是\(2^k\)
所以答案是\(2^{nk}\)
#include<bits/stdc++.h>
using namespace std;
const int Mod = 1e9 + 7;
int mul(int a, int b) {
return 1ll * a * b % Mod;
}
int fast_pow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = mul(a, res);
b >>= 1;
a = mul(a, a);
}
return res;
}
int main() {
int n, k; cin >> n >> k;
cout << fast_pow(fast_pow(2, n), k);
return 0;
}