51nod-1310: Chandrima and XOR
【传送门: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的更多相关文章
- [51nod1310]Chandrima and XOR
有这样一个小到大排列的无穷序列S:1, 2, 4, 5, 8......,其中任何一个数转为2进制不包括2个连续的1.给出一个长度为N的正整数数组A,A1, A2......An记录的是下标(下标从1 ...
- 51nod 1295 XOR key | 可持久化Trie树
51nod 1295 XOR key 这也是很久以前就想做的一道板子题了--学了一点可持久化之后我终于会做这道题了! 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X ...
- 51Nod XOR key —— 区间最大异或值 可持久化字典树
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1295 1295 XOR key 题目来源: HackerRa ...
- [多校联考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] ...
- 51nod 1295 XOR key 可持久化01字典树
题意 给出一个长度为\(n\)的正整数数组\(a\),再给出\(q\)个询问,每次询问给出3个数,\(L,R,X(L<=R)\).求\(a[L]\)至\(a[R]\)这\(R-L+1\)个数中, ...
- 51nod 1295 XOR key (可持久化Trie树)
1295 XOR key 题目来源: HackerRank 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个长度为N的正整数数组A,再给出Q个查 ...
- 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] ...
- 51Nod - 1295:XOR key (可持久化Trie求区间最大异或)
给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求ALL 至 ARR 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值 ...
- 51nod 1622 集合对[算法马拉松19 C]
题目链接:https://www.51nod.com/contest/problem.html#!problemId=1622 第一次参加算法马拉松,我就是去看大神们疯狂秒题,然后感受绝望的orz.. ...
随机推荐
- windows下使用libsvm3.2
一.官方介绍 libsvm主页:https://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html libsvm介绍文档:http://www.csie.ntu. ...
- 【Linux】进程调度概述
1 可运行队列 (基于实时进程调度) 调度程序中最主要的数据结构式运行队列(runqueue).可运行队列是给定处理器上的可运行进程的链表,每一个处理器一个. 每一个可投入运行的进程都唯一的归属于一个 ...
- bzoj1022: [SHOI2008]小约翰的游戏John(博弈SG-nim游戏)
1022: [SHOI2008]小约翰的游戏John 题目:传送门 题目大意: 一道反nim游戏,即给出n堆石子,每次可以取完任意一堆或一堆中的若干个(至少取1),最后一个取的LOSE 题解: 一道 ...
- codeblocks开源的c、c++编译器,小巧方便
1.下载带gun的版本 2.设置编译的位置 3.创建项目 4.执行项目 有意思的开源的c编译器 ~~~
- [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)
题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...
- spm 捕获
目录 自动捕获 从library cache 中加载 从SQL 调优级加载 1.自动捕获 当optimizer_capture_sql_plan_baselines参数设置为TRUE,查询优化器自动存 ...
- GetExecutingAssembly() 和 GetCallingAssembly() 的区别
在TCX_1710项目代码的启动项目根目录路径下的Global.asax.cs配置文件中的MVCApplication类中的Application_Start()方法中,配置了项目启动时要加载的项目信 ...
- SpringBoot(二) 主程序详解和配置文件如何配置
SpringBoot主程序详解 /** * @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用 */ @SpringBootApplication ...
- 【原创】VSFTP: Login failure: 530 Login incorrect的解决办法
1.修改/etc/vsftpd/ftpusers和/etc/vsftpd/user_list中关于root的行,注释掉即可: 2.关闭SELinux:如果不想关闭的话,可以打开home项的布林值:se ...
- atom安装插件失败 latex
用atom写latex 链接 http://www.cnblogs.com/schaepher/p/5934184.html 但在gui下安装插件失败 按照以下步骤解决了 安装gitbash cd . ...