959F - Mahmoud and Ehab and yet another xor task xor+dp(递推形)+离线
959F - Mahmoud and Ehab and yet another xor task xor+dp+离线
题意
给出 n个值和q个询问,询问l,x,表示前l个数字子序列的异或和为x的子序列有多少,其中空序列的异或和为0,一个数字的子序列的异或和是它本身
思路
维护一个集合,记录已经存在在里面的数。
首先我们证明
1.当x在这个集合,y在这个集合的时候\(x\bigoplus y\)也在这个集合里面,因为
\(x=a\bigoplus b\)
\(y=c\bigoplus d\)
所有\(x\bigoplus y==a\bigoplus b \bigoplus c\bigoplus d\)所一定存在在集合中
2.当x在这个集合中y不在这个集合中的时候,\(x\bigoplus y\)不在这个集合中
假设\(x\bigoplus y\)在这个集合中 那么\((x\bigoplus y)\bigoplus x\)也在这个集合中也就是y在这个集合中与题设矛盾
设dp[i][x]表示前i个异或和为x的数量,则有\(dp[i][x]=dp[i-1][x]+dp[i-1][x\bigoplus a[i]]\)
我们用数学归纳法证明 假设对i-1的都成立。
设dp[i-1][x]=j
假设x和a[i]都在set集合中
那么由以上的证明可以知道\(x\bigoplus a[i]\)也在集合中因此,\(dp[i-1][x]=j\)并且\(dp[i-1][x\bigoplus a[i]]=j\)因为dp[i-1][x]的数量已经知道是j了,而a[i]又在集合中,所以每个异或和为x的子序列再异或一个a[i]就变成了\(dp[i-1][x\bigoplus a[i]]\)所以两者数量都为j。
假设a[i]不在集合中
对于x有三种情况
如果x在集合中,由以上证明\(x\bigoplus a[i]\)不在集合中\(dp[i][x]=dp[i-1][x]+dp[i-1][x\bigoplus a[i]]=j+0=0\)
如果x要在这一步被添加到set中,即\(x\bigoplus a[i]\)在集合中,那么有\(dp[i][x]=dp[i-1][x]+dp[i-1][x\bigoplus a[i]]=0+j=j\)
如果不属于上面三种情况,那么\(dp[i][x]=dp[i-1][x]+dp[i-1][x\bigoplus a[i]]=0+0=0\)
得证
ps:for(auto:s)s.pb()在有的版本不会死循环,但以后要注意,避免傻逼错误
#include<bits/stdc++.h>
#define pb push_back
#define F first
#define S second
#define pii pair<int,int>
typedef long long ll;
using namespace std;
const ll maxn=1e5+7;;
const int mod=1e9+7;
int vis[(1<<20)+5];
vector<int>s;
int ans[maxn];
int a[maxn];
vector<pair<int,int> >v[(1<<20)+5];
int main(){
int n,q;
int x,y;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=q;i++){
scanf("%d%d",&x,&y);
v[x].pb({y,i});
}
ll tmp=1;
s.pb(0);
vis[0]=1;
for(int i=1;i<=n;i++){
//cout<<i<<endl;
if(vis[a[i]]){
tmp=tmp*2%mod;
// cout<<111<<endl;
}
else {
/*for(auto p:s){
vis[p^a[i]]=1;
s.pb(p^a[i]);
}*/
int zz=s.size();
for(int j=0;j<zz;j++){
// cout<<s.size()<<" "<<j<<endl;
vis[s[j]^a[i]]=1;
s.pb(s[j]^a[i]);
}
}
// cout<<333<<endl;
/*for(auto&p:v[i]){
ans[p.S]=tmp*vis[p.F];
}*/
for(int j=0;j<v[i].size();j++){
ans[v[i][j].S]=tmp*vis[v[i][j].F];
}
}
for(int i=1;i<=q;i++){
printf("%d\n",ans[i]);
}
return 0;
}
959F - Mahmoud and Ehab and yet another xor task xor+dp(递推形)+离线的更多相关文章
- codeforces-473D Mahmoud and Ehab and another array construction task (素数筛法+贪心)
题目传送门 题目大意:先提供一个数组,让你造一个数组,这个数组的要求是 1 各元素之间都互质 2 字典序大于等于原数组 3 每一个元素都大于2 思路: 1.两个数互质的意思就是没有公因子.所以每 ...
- Codeforces 959D. Mahmoud and Ehab and another array construction task(构造, 简单数论)
Codeforces 959D. Mahmoud and Ehab and another array construction task 题意 构造一个任意两个数都互质的序列,使其字典序大等于a序列 ...
- D. Mahmoud and Ehab and another array construction task 因子分界模板+贪心+数学
D. Mahmoud and Ehab and another array construction task 因子分解模板 题意 给出一个原序列a 找出一个字典序大于a的序列b,使得任意 \(i!= ...
- Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)
Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #inclu ...
- CF959D Mahmoud and Ehab and another array construction task 数学
Mahmoud has an array a consisting of n integers. He asked Ehab to find another array b of the same l ...
- Codeforces 959 D Mahmoud and Ehab and another array construction task
Discription Mahmoud has an array a consisting of n integers. He asked Ehab to find another arrayb of ...
- [CF959D]Mahmoud and Ehab and another array construction task题解
解法 非常暴力的模拟. 一开始吧\(1 -> 2 \times 10^6\)全部扔进一个set里,如果之前取得数都是与原数组相同的,那么lower_bound一下找到set中大于等于它的数,否则 ...
- Codeforces 862C - Mahmoud and Ehab and the xor
862C - Mahmoud and Ehab and the xor 思路:找两对异或后等于(1<<17-1)的数(相当于加起来等于1<<17-1),两个再异或一下就变成0了 ...
- Codeforces 959 F. Mahmoud and Ehab and yet another xor task
\(>Codeforces\space959 F. Mahmoud\ and\ Ehab\ and\ yet\ another\ xor\ task<\) 题目大意 : 给出一个长度为 \ ...
随机推荐
- Educational Codeforces Round 80 (Rated for Div. 2)(A-E)
C D E 这三道题感觉挺好 决定程序是否能通过优化在要求的时间内完成,程序运行时间为t,你可以选择花X天来优化,优化后程序的运行时间为t/(x+1)取上整,花费的时间为程序运行时间加上优 ...
- UVA11732(Trie树)
鸣谢https://blog.csdn.net/Baoli1008/article/details/4441936,基本都是抄的代码 #pragma GCC optimize(2) #include ...
- element-ui 1.4.13
Form 表单 rules 表单校验函数需要访问实例中的属性时应该把校验规则写为computed,校验函数写入methods <el-form-item prop="taxableIn ...
- linux commands - 一次性解压多个tar.gz文件
tar -zxvf list所有tar.gz文件,然后利用xargs将其作为参数传给tar命令.-n 1表示每次传一个参数. xargs: https://www.cnblogs.com/wangqi ...
- c#判断字符串是否可以转日期格式
在C#中,对格式的判断有一类专门函数,那就是TryParse.TryParse在各个不同的类型类(如int,string,DateTime)中,都是存在的.在TryParse中一般有两个参数,一个是待 ...
- MySQL必会的50个常见面试练习题
下面的SQL题目都是比较基础,比较常见的数据库SQL面试题,在技术面试环节虽然碰到相同题目的机会比较少,但解题的基本思路都是差 不多的.下面是SQL面试题描述: Student(Sid,Sname,S ...
- Bootstrap Table踩坑——设置多级表头后只显示第一级表头问题解决办法
今天设置了Bootstrap Table的复杂表头,设置了多级表头(两行列名),但是只能显示第一级表头(第一行的列名),第二级的表头被第一级的表头覆盖.但是我仿照其他网上的其他设置复杂表头例子都能正常 ...
- 题解【AcWing883】高斯消元解线性方程组
题面 高斯消元模板题. 这里直接讲述一下高斯消元的算法流程: 枚举每一列 \(c\): 找到第 \(c\) 列绝对值最大的一行: 将这一行换到最上面: 将该行的第一个数变成 \(1\): 将下面所有行 ...
- 【已解决】使用 yarn 安装时,报错node_modules\node sass:Command failed.
npm install -g mirror-config-china --registry=http://registry.npm.taobao.org npm install node-sass y ...
- PP: Modeling extreme events in time series prediction
KDD: Knowledge Discovery and Data Mining (KDD) Insititute: 复旦大学,中科大 Problem: time series prediction; ...