【传送门:51nod-1310


简要题意:

  有一个数组S,保证里面的数是从小到大的,而且每一个数的二进制中都没有连续的1,如:1,2,4,5,8...

  给出n,然后给出n个位置,求出S数组中n个位置的异或和


题解:

  数位DP好题,卡了老久

  设f[i]表示2i-1到2i-1中有多少个数是在数组S中的

  转移很容易想到$f[i]=1+\sum_{j=1}^{i-2}f[j]$

  而也可以得到$f[i-1]=1+\sum_{j=1}^{i-3}f[j]$

  上下两式合并得到$f[i]=f[i-1]+f[i-2]$

  就是斐波那契数列,f[1]=f[2]=1

  设s[i]为1到2i-1中有多少个数是在数组S中的,显然$s[i]=\sum_{j=1}^{i}f[j]$

  然后就可以做了,对于一个位置x,二分找到最大的小于x的s[m],将x-s[m]-1后再进行递归二分,复杂度为O((logn)2)

  只要在途中维护异或就行了,设P[i]为答案二进制中第i位的数,对于找到的m,将P[m]^=1就好了

  最后转换成二进制就行了,注意可能在算2的次方的时候会爆long long,所以要用快速幂


参考代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
int P[],tot;
LL a[],Mod=1e9+;
LL f[],s[];
void pre()
{
tot=;
f[]=;f[]=;
s[]=;s[]=;
for(tot=;;tot++)
{
f[tot]=f[tot-]+f[tot-];
s[tot]=f[tot]+s[tot-];
if(s[tot]>1e18) break;
}
}
void getp(LL x)
{
if(x==) return ;
int l=,r=tot,m;
while(l<=r)
{
int mid=(l+r)/;
if(x>s[mid]) m=mid,l=mid+;
else r=mid-;
}
P[m]^=;
getp(x-s[m]-);
}
LL p_mod(LL a,LL b)
{
LL ans=;
while(b!=)
{
if(b%==) ans=ans*a%Mod;
a=a*a%Mod;b/=;
}
return ans;
}
int main()
{
pre();
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
getp(a[i]);
}
LL ans=;
for(int i=;i<=tot;i++) ans=(ans+LL(P[i])*p_mod(,i))%Mod;
printf("%lld\n",ans);
return ;
}

51nod-1310: Chandrima and XOR的更多相关文章

  1. [51nod1310]Chandrima and XOR

    有这样一个小到大排列的无穷序列S:1, 2, 4, 5, 8......,其中任何一个数转为2进制不包括2个连续的1.给出一个长度为N的正整数数组A,A1, A2......An记录的是下标(下标从1 ...

  2. 51nod 1295 XOR key | 可持久化Trie树

    51nod 1295 XOR key 这也是很久以前就想做的一道板子题了--学了一点可持久化之后我终于会做这道题了! 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X ...

  3. 51Nod XOR key —— 区间最大异或值 可持久化字典树

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1295 1295 XOR key  题目来源: HackerRa ...

  4. [多校联考2019(Round 4 T1)][51nod 1295]Xor key(可持久化trie)

    [51nod 1295]Xor key(可持久化trie) 题面 给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] ...

  5. 51nod 1295 XOR key 可持久化01字典树

    题意 给出一个长度为\(n\)的正整数数组\(a\),再给出\(q\)个询问,每次询问给出3个数,\(L,R,X(L<=R)\).求\(a[L]\)至\(a[R]\)这\(R-L+1\)个数中, ...

  6. 51nod 1295 XOR key (可持久化Trie树)

    1295 XOR key  题目来源: HackerRank 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题   给出一个长度为N的正整数数组A,再给出Q个查 ...

  7. 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)

    1295 XOR key 2 秒 262,144 KB 160 分 6 级题   给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...

  8. 51Nod - 1295:XOR key (可持久化Trie求区间最大异或)

    给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求ALL 至 ARR 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值 ...

  9. 51nod 1622 集合对[算法马拉松19 C]

    题目链接:https://www.51nod.com/contest/problem.html#!problemId=1622 第一次参加算法马拉松,我就是去看大神们疯狂秒题,然后感受绝望的orz.. ...

随机推荐

  1. Image Processing for Very Large Images

    The key idea here is the partial image descriptor VIPS(VASARI Image Processing System) 是近几年逐渐兴起的针对大图 ...

  2. C#-单元测试知识点

    指的是软件中对最小单元进行测试的一种测试方法 开发阶段的测试发现问题并解决问题是最节省时间和成本 Ctrl+R Ctrl+A 自动化执行单元测试 查看代码覆盖率,通常要达到80,90%的代码测试覆盖率 ...

  3. HDU 2841

    明显,当(X,Y)=1时,是可以看见的. 这题,记得POJ 上也有类似的一题... 不过比较奇怪的是,我以为会超时,因为范围达到了100000,但竟然直接枚举没超时.... #include < ...

  4. 浅谈关于collection接口及相关容器类(一)

    Collection在英文单词的意思是:採集,收集. 而在JAVA API 文档中它是一个收集数据对象的容器. Collection作为容器类的根接口.例如以下图(部分子接口未写出): waterma ...

  5. mysql的查询练习1

    1.多表查询

  6. java-面向对象(二)

    这几天正在看HeadFirst的时候,突然认为面向对象的几个特点,有点理解模糊不清.所以在这再次回想一下,加深印象. 上篇博客(http://blog.csdn.net/u010539352/arti ...

  7. 时间处理工具类TimeUtil

    转自:https://cnblogs.com/ityouknow/p/5662753.html 功能 Date与String之间的互相转换,以及一些特殊格式的时间字符串处理 代码 /** * 类名:T ...

  8. 关于如何让cell一直保持选中?

    在M上 1.cell的展示,一直都是依靠数据源的支持.所以,必须要在数据源里面新增bool,默认为false 在V上 2.cell的setModel方法里面,将数据源的新增bool赋值为cell的是否 ...

  9. html5+css3+javascript 自定义提示窗口

    效果图: 源码: 1.demo.jsp <%@ page contentType="text/html;charset=UTF-8" language="java& ...

  10. 51nod 1717 好数 (水题)

    题目: 看起来很复杂,其实就是有多少个素因子就翻转多少次. 然后考虑到只有平方数有奇数个素因子. 一次过,上代码把: #include <iostream> #include <al ...