私たちは再編成、最後が、1つを考えないようにしましょう その上
質問の意味:範囲内で
ルームを選択します
の各要素の出現数が偶数であるような異なるセット
あなたが選択したいとし
セット、私たちが落ち着く場合
Geは、各要素を満たすために制限の偶数であり、最後のセットが決定される
活発に
ので、
選択を示します
設定して法的プログラム、および除外転送の数が
減算前
セットは、最後にブランクが満たされており、プログラムの同じ番号の前にインペリアルセットと最後のものは
最初に
二列挙重複位置
のコレクションの中で注意を命じています
#include<bits/stdc++.h>
#define cs const
using namespace std;
cs int Mod = 100000007;
cs int N = 1e6 + 5;
int add(int a, int b){ return a + b >= Mod ? a + b - Mod : a + b; }
int mul(int a, int b){ return 1ll * a * b % Mod; }
int ksm(int a, int b){ int ans = 1; for(;b;b>>=1,a=mul(a,a)) if(b&1) ans = mul(ans, a); return ans; }
int dec(int a, int b){ return a - b < 0 ? a - b + Mod : a - b; }
int n, m, fac[N], f[N];
int main(){
scanf("%d%d", &n, &m);
int up = dec(ksm(2, n),1); fac[0] = 1; int inv = 1;
for(int i = 1; i <= m; i++) inv = mul(inv, i); inv = ksm(inv, Mod-2);
for(int i = 1; i <= m; i++) fac[i] = mul(fac[i - 1], (up - i + 1));
f[0] = 1;
for(int i = 2; i <= m; i++){
f[i] = dec(fac[i - 1], add(f[i - 1], mul(mul(i-1, dec(up,i-2)), f[i-2])));
} cout << mul(f[m], inv); return 0;
}