BD String

BD String

Accepts: 388
Submissions: 1164
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description

众所周知,度度熊喜欢的字符只有两个:B和D。

今天,它发明了一种用B和D组成字符串的规则:

S(1)=BS(1)=BS(1)=B

S(2)=BBDS(2)=BBDS(2)=BBD

S(3)=BBDBBDDS(3)=BBDBBDDS(3)=BBDBBDD

S(n)=S(n−1)+B+reverse(flip(S(n−1))S(n)=S(n-1)+B+reverse(flip(S(n-1))S(n)=S(n1)+B+reverse(flip(S(n1))

其中,reverse(s)reverse(s)reverse(s)指将字符串翻转,比如reverse(BBD)=DBBreverse(BBD)=DBBreverse(BBD)=DBB,flip(s)flip(s)flip(s)指将字符串中的BBB替换为DDD,DDD替换为BBB,比如flip(BBD)=DDBflip(BBD)=DDBflip(BBD)=DDB。

虽然度度熊平常只用它的电脑玩连连看,这丝毫不妨碍这台机器无与伦比的运算速度,目前它已经算出了S(21000)S(2^{1000})S(21000​​)的内容,但度度熊毕竟只是只熊,一次读不完这么长的字符串。它现在想知道,这个字符串的第LLL位(从1开始)到第RRR位,含有的BBB的个数是多少?

Input

第一行一个整数TTT,表示T(1≤T≤1000)T(1 \leq T \leq 1000)T(1T1000) 组数据。

每组数据包含两个数LLL和R(1≤L≤R≤1018)R(1 \leq L \leq R \leq 10^{18})R(1LR1018​​) 。

Output

对于每组数据,输出S(21000)S(2^{1000})S(21000​​)表示的字符串的第LLL位到第RRR位中BBB的个数。

Sample Input
3
1 3
1 7
4 8
Sample Output
2
4
3

很好的解释http://www.cnblogs.com/chen9510/p/5515247.html
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<stdlib.h>
 5 #include<string.h>
 6 #include<queue>
 7 #include<stack>
 8 using namespace std;
 9 typedef long long LL;
10 LL ans[66];
11 LL bns[66];
12 LL ask(LL n);
13 int main(void)
14 {
15         LL i,j,k;
16         ans[1]=1;
17         LL ak=2;
18         bns[1]=1;
19         for(i=2; i<=60; i++)
20         {
21                 ak*=2;
22                 ans[i]=ans[i-1]*2;
23                 bns[i]=ak-1;
24         }
25         LL n,m;
26         int s;
27         cin>>s;
28         for(i=0; i<s; i++)
29         {
30                 scanf("%lld %lld",&n,&m);
31                 printf("%lld\n",ask(m)-ask(n-1));
32         }
33         return 0;
34 }
35 LL ask(LL n)
36 {
37         int i;
38         LL sum=0;
39         if(n==0)return 0;
40         for(i=1; i<=60; i++)
41         {
42                 if(bns[i]>=n)
43                         break;
44         }
45         if(n==bns[i])
46         {
47                 return ans[i];
48         }
49         else
50         {
51                 LL cc=n-bns[i-1];
52                 return cc+ask(2*bns[i-1]-n+1);
53         }
54 }
 
   

 

 
  

转载于:https://www.cnblogs.com/zzuli2sjy/p/5517540.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值