http://blog.youkuaiyun.com/kqzxcmh/article/details/8182097
看了这里得出的结论。
题目大意给出0~2^m-1个数求从中取出可以重复的n个数,是的任意一段子段的xor值不为0.
F[i]表示长度为i的不为0的方案数,显然第i+1个可以放置的数为2^m-1-i 表示i个后缀形成的值是不能放的,因为没有一段的xor值为0,所以每个后缀的xor值都是不一样的。
后缀形成的值肯定不同,假设第i的后缀和第j的后缀形成的值相同,那么i和j之间的值异或则为0。
#include<iostream>
using namespace std;
#define LL __int64
#define mod (1000000009)
LL pow(LL a,LL n)
{
if(n==1)
return a;
if(n==0)
return 1;
LL c=pow(a,n/2);
if(n&1)
return c*a%mod*c%mod;
return c*c%mod;
}
int main()
{
LL n,m;
LL ans=1;
cin>>n>>m;
LL k=pow(2,m);
// cout<<k<<endl;
for(LL i=1;i<=n;i++)
ans=ans*(k-i)%mod;
cout<<ans<<endl;
return 0;
}
1407

被折叠的 条评论
为什么被折叠?



