题目大意给出0~2^m-1个数求从中取出可以重复的n个数,是的任意一段子段的xor值不为0.
F[i]表示长度为i的不为0的方案书,显然第i+1个可以放置的数位2^m-1-i 表示i个后缀形成的值是不能放的,因为没有一段的xor值为0,所以每个后缀的xor值都是不一样的。
//cf 148 div 1 A
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef long long LL;
const LL MOD = int(1e9)+9;
LL n,m,t,ans;
int main()
{
cin>>n>>m;
LL t = 1;
for (int i = 1;i<=m;++i) t=t*2%MOD;
t--;
ans=t;
for (int i = 2; i <= n;++i)
{
t--;
if (t<=0) t+=MOD;
ans=ans*t%MOD;
}
cout << ans << endl;
return 0;
}