2018acm山东省赛G

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define all(x) begin(x),end(x)
ll rd(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
const int N=1e3+50;
int a[N];
int dp[N][N];
const int mod=1e9+7;

int main()
{
    freopen("in.txt","r",stdin);

    int t=rd();
    while(t--){
        int n=rd(),d=rd();
        for(int i=1;i<=n;i++)
        a[i]=rd();
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;

        for(int i=1;i<=n;i++){
            for(int j=i;j>=1;j--)
            for(int k=1<<10;k>=0;k--){
                if(dp[k][j-1]>0){
                    dp[k^a[i]][j]=(dp[k][j-1]+dp[k^a[i]][j])%mod;
                    //printf("%d-%d-%d\n",i,j,k);
                    //printf("k^a[i]:%d j:%d dp[k^a[i]][j]:%d\n",k^a[i],j,dp[k^a[i]][j]);
                }
            }
            //printf("%d\n",dp[0][i]);
        }
        //puts("");
        ll ans=0;
        if(d>n)d=n;
        for(int i=0;i<=d;i++)
            ans=(dp[0][n-i]+ans)%mod;
        printf("%lld\n",ans);
            //printf("%d ",dp[0][n-i]);
    }
    return 0;
}
/*
3
5 2
1 1 2 3 4
6 3
1 2 4 7 1 2
*/ 

猜你喜欢

转载自blog.csdn.net/ujn20161222/article/details/80221045