首页 > cf776G.Sherlock and the Encrypted Data

cf776G.Sherlock and the Encrypted Data

题意:对于一个16进制数x,把x的各个数位拿出来,设其为t1,t2,...,定义s(x)为2^t1|2^t2|...,如x=0x3e53,则s(x)=2^3|2^14|2^5|2^3=16424.给出q组询问l,r(l,r也是16进制数,不超过15位),求[l,r]中有多少个数x满足x^s(x)

这题题解写的是个状压数位dp,但是蒟蒻不会数位dp,自己YY了一个做法.

首先,将[l,r]的询问拆成2个前缀和,考虑到十六进制数减1并不方便,可以转化为solve(r)-solve(l),再特判一下l满不满足要求.

考虑求出[0,upper]间的答案.将二进制位从低位向高位,从0开始编号.观察x和s(x)的二进制表示,可以发现当且仅当s(x)的最高位1所在的数位上x也为1时,x^s(x)非常恶心比较多.

 1 program cf776G;
 2 const number=['a'..'f','0'..'9'];
 3       list:array[0..15]of char=('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
 4 var q,i:longint;
 5     l,r:string;
 6     num:array[char] of longint;
 7     ch:char;
 8 procedure getstr(var s:string);
 9 var ch:char;
10 begin
11   s:='';
12   read(ch);
13   while not (ch in number) do read(ch);
14   while ch in number do
15   begin
16     s:=s+ch;
17     read(ch);
18   end;
19 end;
20 function check(const x:string):longint;
21 var i:longint;
22     t,this:int64;
23 begin
24   this:=0;
25   for i:=1 to length(x) do this:=this*16+num[x[i]];
26   t:=0;
27   for i:=1 to length(x) do t:=t or (1 shl num[x[i]]);
28   exit(ord(this xor t<this));
29 end;
30 function solve2(const upper:string;id,up:longint):int64;
31 var upp,ans:int64;
32     i,this,t:longint;
33     sw:array[0..30] of longint;
34     pow:array[0..20] of int64;
35 begin
36   upp:=0;
37   for i:=1 to length(upper) do upp:=upp*16+num[upper[i]];
38   for i:=1 to length(upper) do sw[length(upper)-i]:=num[upper[i]];
39   if(1 shl (id mod 4)>up)or(1 shl id>upp)or(up<0) then exit(0);
40   t:=0;
41   for this:=0 to up do if this and (1 shl (id mod 4))>0 then inc(t);
42   ans:=0;
43   pow[0]:=1;
44   for i:=1 to length(upper) do pow[i]:=pow[i-1]*(up+1);
45   for i:=length(upper)-1 downto 0 do
46     if i=id div 4 then
47     begin
48       if upthen
49       begin
50         ans:=ans+t*pow[i];
51         exit(ans);
52       end;
53       for this:=0 to sw[i]-1 do if this and (1 shl (id mod 4))>0 then
54         ans:=ans+pow[i];
55       if sw[i] and (1 shl (id mod 4))=0 then exit(ans);
56     end else
57     begin
58       if upthen
59       begin
60         if i>id div 4 then ans:=ans+pow[i]*t else ans:=ans+pow[i+1];
61         exit(ans);
62       end else
63       begin
64         if i>id div 4 then ans:=ans+pow[i-1]*sw[i]*t
65           else ans:=ans+pow[i]*sw[i];
66       end;
67     end;
68   inc(ans);
69   exit(ans);
70 end;
71 function solve(const upper:string):int64;
72 var ans:int64;
73     k:longint;
74 begin
75   ans:=0;
76   for k:=0 to 15 do
77     ans:=ans+solve2(upper,k,k)-solve2(upper,k,k-1);
78   exit(ans);
79 end;
80 begin
81   for i:=0 to 15 do num[list[i]]:=i;
82   readln(q);
83   for i:=1 to q do
84   begin
85     getstr(l);getstr(r);
86     writeln(solve(r)-solve(l)+check(l));
87   end;
88 end.
View Code

 

转载于:https://www.cnblogs.com/lkmcfj/p/6473927.html

更多相关:

  •     先吐为敬!   最近心血来潮研究nodejs如何完成微信支付功能,结果网上一搜索,一大堆“代码拷贝党”、“留一手”、“缺斤少两”、“不说人话”、“自己都没跑通还出来发blog”、“各种缺少依赖包”、“各种注释都没有”、“自己都不知道在写什么”的程序大神纷纷为了增加自己博客一个帖子的名额而发布了各种千奇百�...

  • 阅读ceph源码过程中需要明确当前操作是由哪个线程发出,此时需要根据线程id来确认线程名称 C++获取线程id是通过系统调用来直接获取 函数描述 头文件: 函数名称:syscall(SYS_gettid) 该函数直接返回了一个pid_t int类型的数字,即为当前线程id 此外函数pthread_s...

  • 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持。所以这都是你实际生产环境中必须考虑的问题。 面试题剖析 基于数据库的实现方案 数据库自增 id 这个就是说你的...

  • ORM操作    单表、一对多表操作 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(m...

  • 建立如下表: 建表语句: class表创建语句 create table class(cid int not null auto_increment primary key, caption varchar(32) not null)engine=innodb default charset=utf8;student表创建语句 c...

  • 把字符串看作是26进制的数,从后往前翻译,那么就可以把两个串变成对应的26进制的数字,那么只要把两个数加起来除以二就得到中间的串对应的数了,同理再转化回来就行了。但是这样会有一个问题就是串的长度有2e5,26的2e5次方显然不可求,所以需要对每一位进行手动的加和运算。对于两个串,我们假设a串从后往前的每一位对应的数值为a0, a1,...

  • 中国剩余定理说白了就是小学时候的韩信点兵的完全版。给定一系列数,给定条件是一个数MOD这一些列数的结果,问你最后这个数最少为多少。 抽象出来就是N个同余方程,利用扩展GCD就可以求得这一结果,本题给定的数都是互质的,因此处理起来就简单了。 代码如下: #include #include #inc...