Codechef AMXOR
Problem
Solution
我们可以按位进行考虑,如果一个 \(m_i\) 在某一位上为1,但 \(x_i\) 却取了0,那么我们就称它脱离了限制,更低位可以随便乱填。也就是说,只要高位异或的方案合法,这些更低位,无论其他数怎么填,它都可以使得最终结果合法。
那么这就变成了一个比较方便考虑的计数问题了。可以枚举第一个脱离控制的最高位,然后由于可能有多个数脱离控制,我们就选择最后一个脱离控制的数来进行计数。注意如果这一位没有脱离限制,说明所有这一位有1的都填了1,而如果这种异或方案异或出来的0,1方案与k不相同,那么就是不合法的,及时break掉。
时间复杂度 \(O(n\log v)\)
Code
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=100010,mod=1e9+9;
template <typename Tp> inline int getmin(Tp &x,Tp y){return y<x?x=y,1:0;}
template <typename Tp> inline int getmax(Tp &x,Tp y){return y>x?x=y,1:0;}
template <typename Tp> inline void read(Tp &x)
{
x=0;int f=0;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
if(f) x=-x;
}
int z,n,k,ans,a[maxn],lim[32],cnt[32][maxn],f[maxn][2],g[maxn];
int pls(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int solve(int x)
{
int res=0;ll tmp,sum;
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
f[0][0]=1;g[n+1]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<2;j++)
{
if(a[i]>>x&1)
{
tmp=lim[x]-(1<<x)+1;
f[i][j]=(f[i][j]+f[i-1][j]*tmp)%mod;
tmp=(a[i]&lim[x])-(1<<x)+1;
f[i][j]=(f[i][j]+f[i-1][j^1]*tmp)%mod;
}
else
{
tmp=(a[i]&lim[x])+1;
f[i][j]=(f[i][j]+f[i-1][j]*tmp)%mod;
}
}
for(int i=n;i;i--)
{
if(a[i]>>x&1) g[i]=(ll)g[i+1]*((a[i]&lim[x])-(1<<x)+1)%mod;
else g[i]=(ll)g[i+1]*((a[i]&lim[x])+1)%mod;
}
for(int i=1;i<=n;i++)
if(a[i]>>x&1)
res=(res+(ll)f[i-1][(k>>x&1)^(cnt[x][i+1]&1)]*g[i+1])%mod;
return res;
}
int main()
{
read(z);
lim[0]=1;
for(int i=1;i<=30;i++) lim[i]=lim[i-1]<<1|1;
while(z--)
{
read(n);ans=k=0;
for(int i=1;i<=n;i++){read(a[i]);k^=a[i];}
for(int j=30;~j;j--) cnt[j][n+1]=0;
for(int i=n;i;i--)
for(int j=30;~j;j--)
cnt[j][i]=cnt[j][i+1]+(a[i]>>j&1);
for(int i=30;~i;i--)
{
ans=pls(ans,solve(i));
if((cnt[i][1]&1)!=(k>>i&1)) break;
ans=pls(ans,(i==0));
}
printf("%d\n",ans);
}
return 0;
}
Codechef AMXOR的更多相关文章
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- 【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...
- codechef 两题
前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
- BZOJ3509: [CodeChef] COUNTARI
3509: [CodeChef] COUNTARI Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 339 Solved: 85[Submit][St ...
- CodeChef CBAL
题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...
- CodeChef FNCS
题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...
- codechef Prime Distance On Tree(树分治+FFT)
题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
随机推荐
- hbase 自定义过滤器
1.首先生成自定义过滤器,生成jar包,然后拷贝到服务器hbase目录的lib下. 1.1 自定义过滤器CustomFilter import com.google.protobuf.InvalidP ...
- BZOJ4919 [Lydsy1706月赛]大根堆 【dp + 启发式合并】
题目链接 BZOJ4919 题解 链上的\(LIS\)维护一个数组\(f[i]\)表示长度为\(i\)的\(LIS\)最小的结尾大小 我们可以用\(multiset\)来维护这个数组,子树互不影响,启 ...
- 洛谷 P4128 [SHOI2006]有色图 解题报告
P4128 [SHOI2006]有色图 题目描述 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图.如果两张有色图有相同数量的 ...
- java 操作命令行
目的:用java进行调用ab压测 window: cmd ab.exe linux: sh ab.sh 命令: abs -n 500 -c 10 https://www.baidu.com/ > ...
- Google Gson用法
the latest version is 2.8.0. If you're using Gradle, add the following line: compile 'com.google.cod ...
- bzoj1027【JSOI2007】合金
题目描述 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金 ...
- 2018 “百度之星”程序设计大赛 - 初赛(A)度度熊学队列 list rope
c++ list使用 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstr ...
- django中的转义
什么是html转义? 所谓html转义就是将 html关键字(包括标签,特殊字符等) 进行过滤替换.过滤替换格式如下: 接下来我们通过实例演示django中转义的细节以及如何关闭转义 一 dja ...
- NO.1 Day 计算机基础
计算机基础 1.编程语言的作用及与操作系统和硬件的关系 编程语言是程序员与计算机之间沟通的媒介. 一套完整的计算机系统分为计算机硬件.操作系统和软件三部分.编程语言开发的结果为软件.软件的运行在操作系 ...
- U40620 还没想好名字的题
U40620 niiickの还没想好名字的题 给定一个长度为\(n\)的序列\(a_1,a_2...,a_n\) 要求将这\(n\)个数分为\(m\)组,每组可以有任意多个数,但同一组中的数必须是原序 ...