BZOJ4475: [Jsoi2015]子集選取【找規律】【數學】
阿新 • • 發佈:2018-12-07
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; }