1. 程式人生 > >BZOJ4475: [Jsoi2015]子集選取【找規律】【數學】

BZOJ4475: [Jsoi2015]子集選取【找規律】【數學】

Description

img

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;
}