51nod 1310:Chandrima and XOR

51nod 1310:Chandrima and XOR

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1310

题目大意:序列$S=\{1,2,4,5,...\}$,其中任何一个数转为二进制不包括两个连续的$1$。给出一个长度为$N$的正整数数组$A$,$A_1, A_2,...,A_n$记录的是下标(下标从$1$开始)。求$S[A_1]$ Xor $S[A_2]$ Xor $S[A_3]$ ..... Xor $S[A_n]$的结果.

dp

用$dp[i]$维护$i$位二进制数不包括两个连续的$1$的所有数,然后对每个$A_i$迭代求出$S[A_i]$的$1$所在的位.

代码如下:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #define N 91
 4 using namespace std;
 5 typedef long long ll;
 6 const ll p=1000000007;
 7 ll n,a[N],dp[N],x;
 8 ll mul(ll a,ll b){return a*b%p;}
 9 ll powmod(ll x,ll n){
10     ll r=1;
11     while(n){
12         if(n&1)r=mul(r,x);
13         x=mul(x,x);
14         n>>=1;
15     }
16     return r;
17 }
18 void init(){
19     dp[1]=1;
20     for(int i=2;i<N;++i)
21         dp[i]=dp[i-1]+dp[i-2]+1;
22 }
23 int main(void){
24     init();
25     scanf("%lld\n",&n);
26     while(n--){
27         scanf("%lld",&x);
28         while(x){
29             ll idx=lower_bound(dp,dp+N,x)-dp;
30             a[idx]^=1;
31             x-=dp[idx-1]+1;
32         }
33     }
34     ll ans=0;
35     for(int i=0;i<N;++i)if(a[i])
36         ans=(ans+powmod(2,i-1))%p;
37     printf("%lld\n",ans);
38 }
时间: 2024-10-12 13:42:53

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

51nod 1307:绳子与重物

51nod 1307:绳子与重物 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题目大意:给定$n$条绳子,每条绳子有最大承重$C_i$,总量$W_i$和挂点$P_i$,问按顺序挂最多挂几条绳子. 并查集 考虑逆序挂绳子,若当前绳子最大承重小于实际承重,则将后面的绳子删去.复杂度$O(n)$. 代码如下: 1 #include <cstdio> 2 #include <iostream>

51nod 1230:幸运数

51nod 1230:幸运数 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1230 题目大意:如果一个数各个数位上的数字之和是质数,并且各个数位上的数字的平方和也是质数,则称它为幸运数.例如:120是幸运数,因为120的数字之和为3,平方和为5,均为质数,所以120是一个幸运数字.给定x,y,求x,y之间( 包含x,y,即闭区间[x,y])有多少个幸运数. 数位DP 代码如下: 1 #include <cs

51nod 1035:最长的循环节

1035 最长的循环节 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 1000) Output 输出<=n的数中倒数循环节长度最长的那个数 Input示例

51nod 1179:最大的最大公约数

51nod 1179:最大的最大公约数 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1179 题目大意:给出$n$个数,求两两最大公因数的最大值. 数论 套路题,参见http://www.cnblogs.com/barrier/p/6656410.html 代码如下: 1 #include <iostream> 2 #define N 1000000 3 using namespace std; 4 ty

51nod 1406:与查询

51nod 1406:与查询 题目链接:http://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=222358 题目大意:给出$n$个数,问这$n$个数与$x$做位与($\&$)后值为$x$的有多少个. DP 显然暴力是不行的. 由题目可得,若$a \& x=x$,则$x$的二进制表示中为$1$的位,$a$也必为$1$. 故若$x$和$y$仅有一位不同,且$x\&y=x$,则 与$x$做位与后值为$x$的数中 必包含 与

51nod 1354:选数字

51nod 1354:选数字 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1354 题目大意:有$T(T \leqslant 20)$组数据,每组给出$n(n \leqslant 1000)$个数和$K(K \leqslant 100,000,000)$,问在这$n$个数中选取若干个,积为$K$的方案数有多少. DP+离散化 与01背包类似,定义状态$dp[i][j]$为前$i$个数中选取若干个数,积为$j

51nod 1294:修改数组

51nod 1294:修改数组 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1294 题目大意:将一个序列修改成严格递增序列,最少需要替换几个数. dp 这道题相当巧妙. 最小的满足条件的序列为$\{1,2,3,...,n\}$,若$a_i < i$那么该数必须被修改. 然后对序列$\{a_1-1,a_2-2,a_3-3,...,a_n-n\}$找出最长不递减子序列,除去该子序列外的数均要被修改. 复杂度$

51nod 1241:特殊的排序

51nod 1241:特殊的排序 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1241 题目大意:给出$n$个数($1 \leqslant a_i \leqslant n$),现在要对这个数组进行排序,在排序时只能将元素放在数组的头部或尾部,问至少需要移动多少个数字,才能完成整个排序过程? DP 显然最少操作数等于$n-|$最长连续子序列$|$. 故定义状态:$dp[i]$表示以$i$结尾的连续子序列长度.

51nod 1232:完美数

51nod 1232:完美数 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1232 题目大意:如果一个数能够被组成它的各个非$0$数字整除,则称它是完美数.例如:$10$,$11$,$12$,$101$都是完美数,但是$13$就不是完美数(因为$13$不能被数字3整除).现在给定正整数$x$,$y$,求$[x,y]$中共有多少完美数.共有$T$组数据. 数位DP 如果对于$a \equiv r(mod m)