• BZOJ 2844: albus就是要第一个出场(线性基)


    传送门

    解题思路

      题意好绕。。大概意思就是找(k)的排名,元素可重复。考虑线性基,假设(n)个数构成(s)个基,那么剩余的(n-s)个元素一定会被这(s)个基线性表出,所以它们可以选与不选,所以每个元素有(2^{n-s})种取法。然后算出不重复时(k-1)的排名,再乘上(2^{n-s})(+1)即为答案。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define int long long
     
    using namespace std;
    const int N=100005;
    const int MOD=10086;
    typedef long long LL;
     
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
        return f?x:-x;
    }
     
    int n,a[35],Q,cnt,rk[35];
     
    inline int fast_pow(int x,int y){
        int ret=1;
        for(;y;y>>=1){
            if(y&1) ret=(LL)ret*x%MOD;
            x=(LL)x*x%MOD;
        }
        return ret;
    }
     
    inline void insert(int x){
        for(int i=31;i;i--) 
            if((x&(1<<(i-1)))){
                if(!a[i]) {a[i]=x; return;}
                x^=a[i];
            }
    }
     
    inline void solve(int x){
        int now=0;
        for(int i=1;i<=31;i++) 
            if(a[i]) rk[++cnt]=(1<<(i-1));
        for(int i=1;i<=cnt;i++)  if((x&rk[i])) now+=(1<<(i-1));
        now%=MOD; printf("%lld
    ",((LL)fast_pow(2,n-cnt)*now%MOD+1)%MOD);
    }
     
    signed main(){
        n=rd(); int x;
        for(int i=1;i<=n;i++)   
            x=rd(),insert(x);
        Q=rd(); solve(Q);
        return 0;
    }
    
    
  • 相关阅读:
    优化-IO
    优化-cpu
    优化-内存
    系统优化
    snort -- 入侵检测系统
    tripwire--入侵检测系统
    sudo
    selinux
    pptpd
    C++ 内联函数
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/10280321.html
Copyright © 2020-2023  润新知