【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中出现的最小位置。 ...
  • jiangyuze831
  • jiangyuze831
  • 2015年02月05日 09:16
  • 1516

【BZOJ 2844】 albus就是要第一个出场

高斯消元好题~
  • Regina8023
  • Regina8023
  • 2015年01月11日 12:29
  • 1688

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

Time Limit: 6 Sec Memory Limit: 128 MBDescription已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 ...
  • huayunhualuo
  • huayunhualuo
  • 2016年11月14日 00:21
  • 251

[BZOJ2844]albus就是要第一个出场(线性基)

明天5点就要坐车,那也就是说4点就要起床?!!
  • FromATP
  • FromATP
  • 2017年05月06日 17:50
  • 298

[线性基] BZOJ2844: albus就是要第一个出场

有个结论:一个可异或得到的数,用原来 nn 个数异或得到它都有 2n−cnt2^{n-cnt} 种组合方法。想想发现是很有道理的,就是不要把消出的 n−cntn-cnt 扔掉,00 怎么异或都不变的,...
  • CHHNZ
  • CHHNZ
  • 2017年12月24日 21:20
  • 90

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

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

【bzoj 2844】: albus就是要第一个出场

http://www.lydsy.com/JudgeOnline/problem.php?id=2844 先求线性基,那么可以得到0的个数cnt0 每个数与0异或都会得到2^cnt0这...
  • willinglive
  • willinglive
  • 2015年03月18日 20:56
  • 471

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

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

bzoj2844 albus就是要第一个出场

线性基+数位dp
  • sdfzyhx
  • sdfzyhx
  • 2017年01月30日 16:19
  • 115

【bzoj2844】albus就是要第一个出场 高斯消元

首先预处理出线性基,最多32个有用的数和一堆0 依次看每一位,计算卡上界的数的个数 #include #include #include #include #include #incl...
  • u012288458
  • u012288458
  • 2016年05月19日 10:27
  • 486
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ2844】albus就是要第一个出场,线性基
举报原因:
原因补充:

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