HDU5694-BD String-数学归纳找规律
来源:互联网 发布:知豆电动汽车官方网站 编辑:程序博客网 时间:2024/05/16 09:48
题目:
众所周知,度度熊喜欢的字符只有两个:B和D。
今天,它发明了一种用B和D组成字符串的规则:
其中,
虽然度度熊平常只用它的电脑玩连连看,这丝毫不妨碍这台机器无与伦比的运算速度,目前它已经算出了
L,R<10^18
思路
可以通过观察前面一个字符串是后一个字符串的前缀,也就是s(n)中包含前面所有的字符串。所以其实可以只考虑一个字符串,s(2^1000)字符串早就超出10^18所以根本不用考虑,只要考虑10^18以内就OK了。
继续推导,L到R的B的数量,可以表示成,sumb(R)-sumb(L-1);
接下来就是如何求sumb(x)
如果x=2^p 则sumb(x)=2^(p-1)+1;否则sumb(x)=2^(p-1)+1-sumd(2^p-x-1)-1;
(这里说明一下x到2^p的那段距离就是这个字符串的前缀只不过前后反转,bd互调,所以这里减去了sumd)
同样sumd的求发
如果x=2^p 则sumd(x)=2^(p-1)-1;否则sumd(x)=2^(p-1)-1-sumb(2^p-x-1);
#include<bits/stdc++.h>using namespace std;long long b[100];long long sumb(long long x);long long sumd(long long x);long long sumb(long long x) { if(x==0) return 0; if(x==1) return 1; long long tt=1; int i=0; while(tt<x) { tt*=2; i++; } if(tt==x) { return b[i-1]+1; } else { return b[i-1]+1-sumd(tt-x-1)-1; }}long long sumd(long long x) { if(x==0) return 0; if(x==1||x==2) return 0; long long tt=1; int i=0; while(tt<x) { tt*=2; i++; } if(tt==x) { return b[i-1]-1; } else { return b[i-1]-1-sumb(tt-x-1); }}int main(){ int t; b[0]=1; for(int i=1;i<=62;i++) b[i]=b[i-1]*2; long long l,r; scanf("%d",&t); while(t--) { scanf("%lld%lld",&l,&r); printf("%lld\n",sumb(r)-sumb(l-1)); } return 0;}
0 0
- HDU5694-BD String-数学归纳找规律
- hdu5694(规律+分治)BD String
- HDU5694 BD String(百度之星2A)
- hdu5694--BD String(2016百度之星Round2A/1005)
- 2016"百度之星" - 初赛(Astar Round2A)1005 BD String (找规律)
- 数学+找规律题
- 【lightoj1008】数学找规律
- 数学- 找规律 HDU3054
- 数学找规律 number
- 找规律:String Change
- SGU 105 数学找规律
- POJ 1019 数学找规律
- 数学 找规律HDU-1030
- 【数学期望 && 找规律】HDU
- 数学+矩阵快速幂 | 打表找规律+数学归纳
- HDU 4279(数学+找规律)
- sgu 169 数学推导,找规律
- HDU 1030 纯数学 找规律
- 代理模式
- Java学习之路(第一天)
- bzoj3670【NOI2014】动物园
- 软件工程 — Chapter1
- 数据结构之链表
- HDU5694-BD String-数学归纳找规律
- CSS高效开发实战 4567
- Freedom, peace and love
- Web安全XSS&CSRF
- DirectFB、Layer、Window、Surface之间关系
- ios开发中经典应用高仿项目分享<二>
- ios 画图板
- 微博推荐算法简述
- 选择问题