构造一个长度为N的一个序列,其中元素只能是0~2^m-1;
构造出来的序列需要保证任意区间内的亦或值不能为0.;
思路:
暴力打表找找规律就行了。
不难发现其如果n==1的时候,结果就是2^m-1;
如果n>1的时候,是随着n的递增,而成倍数递增的。
具体规律参考一下代码就行了。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
__int64 mod=1000000009;
__int64 mi(__int64 a,__int64 b)
{
__int64 ans=1;
a%=mod;
while(b>0)
{
if(b%2==1)ans=(ans*a)%mod;
b/=2;
a=(a*a)%mod;
}
return ans;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
__int64 ans=mi(2,m);
ans-=1;
__int64 temp=ans-1;
ans=(ans%mod+mod)%mod;
temp=(temp%mod+mod)%mod;
for(int i=2;i<=n;i++)
{
ans*=temp;
ans%=mod;
temp--;
temp=(temp%mod+mod)%mod;
}
printf("%I64d\n",ans%mod);
}
}