【BZOJ2844】albus就是要第一个出场,线性基

原创 2016年08月29日 20:37:06

Time:2016.08.29
Author:xiaoyimi
转载注明出处谢谢



传送门
喜闻乐见的线性基乱搞题
如果n个数消出m个线性基,那么这n个数能异或出的值有2m
这个很显然,但还有个很神奇的性质
2m种值各会出现2nm
这就很简单了是不是啊
枚举x的每个二进制位
sum[i]表示第1-i位上的线性基个数,m表示n个数总共的线性基个数
如果当前位i为1,那么ans就要加上2nm+sum[i1]
第i位上的线性基不能算,所以从i-1位上开始算起,共2sum[i1]种线性基,每种2nm
复杂度就是求线性基的复杂度O(31n)
代码:

#include<cstdio>
#define mo 10086
#define M 100003
using namespace std;
int n,x,sum;
int a[M],lb[32];
int qr(int x,int y)
{
    int t=1;
    for (;y;y>>=1,x=x*x%mo)
        if (y&1) t=t*x%mo;
    return t;
}
int in()
{
    int t=0;char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') t=(t<<3)+(t<<1)+ch-48,ch=getchar();
    return t;
}
main()
{
    n=in(); 
    for (int i=1;i<=n;++i) a[i]=in();
    x=in();
    for (int j=1;j<=n;++j)
        for (int i=30;i>=0;--i)
            if (a[j]>>i&1)
                if (!lb[i]) 
                    {lb[i]=a[j];++sum;break;}
                else
                    a[j]^=lb[i];
    int ans=1,tt=sum;
    for (int i=30;i>=0;--i)
    if (lb[i])
    {
        --sum;
        if (x>>i&1)
            ans=(ans+qr(2,sum+n-tt))%mo;
    }
    printf("%d\n",ans);
}
版权声明:不转不是中国人!(滑稽)

BZOJ 2844 albus就是要第一个出场 高斯消元+线性基

题目大意:给出一个长度为n的正整数数列A。每次选出A的一个子集进行抑或(空集抑或值为0),这样就得到一个长度为2^n的数列B。将B中元素升序排序。给出一个数字m,求m的B中出现的最小位置。 ...

【BZOJ2844】albus就是要第一个出场 线性基 高斯消元

题意:需要注意的是空集(0)是天生被包括的,我为了这个WA了好久~拍了好久,醉了好久~ 题解: 首先有一个我并不知道是为什么(甚至不知道它对不对)的性质: 每一种权值会出现2的自由元(n-线性基个...
  • Vmurder
  • Vmurder
  • 2015年02月03日 20:38
  • 1261

[BZOJ2844]albus就是要第一个出场 高斯消元+线性基

网上写的题解都好简略啊。。。 假设n个数一共消出了k个线性基。n个数能xor的所有数一共有2^n个(不去重),k个基能xor出的数一共有2^k个(本身就没有重复)。所以xor的值域中每个数都出现了2...
  • DOFYPXY
  • DOFYPXY
  • 2017年04月10日 22:06
  • 150

BZOJ2844 albus就是要第一个出场

BZOJ2844 albus就是要第一个出场 题解

BZOJ 2844(albus就是要第一个出场-gauss_xor方程组)

题目大意:有n个数的序列A,每次选出A的一个子集(可以为空集)进行xor,这样就得到2^n个数,将其升序排序得到数列B,求k在B出现的最小位置?利用gauss_xor消元,统计独立元个数计算 注意 ...

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

2844: albus就是要第一个出场 Time Limit: 6 Sec  Memory Limit: 128 MB Submit: 1635  Solved: 680 [Submit][Statu...

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

Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 集构成的集合。定义映射 f : 2^S -> Zf(空集) = 0f(T) = XOR A[t...

BZOJ 2844 albus就是要第一个出场

线性基+高斯消元

BZOJ 2844 albus就是要第一个出场 高斯消元

题目大意:给定一个n个数的集合S和一个数x,求x在S的2^n个子集从大到小的异或和序列中最早出现的位置 有学长真好不用自己打题目大意了233 首先我们求出线性基 我们会得到一些从大到小排列的数和一...
  • PoPoQQQ
  • PoPoQQQ
  • 2014年10月06日 16:14
  • 2386

bzoj2844 albus就是要第一个出场

线性基+数位dp
  • sdfzyhx
  • sdfzyhx
  • 2017年01月30日 16:19
  • 95
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ2844】albus就是要第一个出场,线性基
举报原因:
原因补充:

(最多只允许输入30个字)