-
题目大意
给定n,m两个值,从0~2^m-1中挑选n个数(可重复),使得在以n为长度的序列中,任意子区间中数的异或值都不为0。 -
思路
一开始做的时候,读错题,以为是任意区间的异或值都等于0,发现样例不对,耽误了好久,后来结束后才知道咋回事。
可以从n=1开始找规律
n=1:当前区间的子区间只有本身,也就是只要保证本身不为0即可,有2^m-1种;
n=2:两个数的时候分别来填写,第一个数是n=1时的情况,而第二个数除了0之外,也不能与第一个数相同,因为相同的两个数异或值为0,这样的话第二个数就有2^m-2,和上面的相乘即可
n=3:由n=2推得前两个数,第三个数除了0,与第二个数相同的数外还要除去第一个数和第二个数的异或值,这样第三个数就有2^m-3,和上面n=2的结果相乘即可
下面以此类推
计算2^m-1时直接用快速幂模板即可 -
代码`
#include<bits/stdc++.h>
#define mod 1000000009
using namespace std;
int mul(int a,int b,int p)///快速幂模板
{
int ans=1%p;
for(; b; b>>=1)
{
if(b&1)
ans=(long long)ans*a%p;
a=(long long)a*a%p;
}
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
long long ans=mul(2,m,mod)-1;
long long res=1;
for(int i=0; i<n; i++)
{
res=res*ans%mod;
ans--;
}
cout<<res%mod<<endl;
return 0;
}