Number

题目背景

SOURCE:NOIP2015-SHY-10

题目描述

如果一个数能够表示成两两不同的 3 的幂次的和,就说这个数是好的。

比如 13 是好的,因为 13 = 9 + 3 + 1 。

又比如 90 是好的,因为 90 = 81 + 9 。

现在我们用 a[i] 表示第 i 小的好数。

比如 a[1] = 1, a[2] = 3, a[5] = 10 。

给定 L,R,请求出 a[L] 到 a[R] 的 和 mod 232。

输入格式

第一行一个整数 T,表示数据组数。

接下来 T 行,每行两个整数 L,R 表示一组询问。

输出格式

输出 T 行,每行为一个整数,表示相应询问的答案。

样例数据 1

输入

5

1 3

3 3

4 5

6 7

2 5

输出

8

4

19

25

26

备注

【数据范围】

对 30% 的输入数据:1≤T≤100;R≤1000 。

对 100% 的输入数据:1≤T≤100000;1≤L≤R≤10^18 。

考试的时候正解没调出来,只能交30分暴力233。。。

其实就是类似于二进制倍增的方法来处理一波三进制啊。。。

事实上我们只需要统计每个三进制位出现的次数就可以求得答案。

这让我们想到最高位在取与不取的时候会影响地位低位的情况,因此我们可以像数位dp那样讨论最高位的情况。

代码:

#include<bits/stdc++.h>
#define uint unsigned int
#define ll long long
using namespace std;
inline ll read(){ll ans=0;char ch=getchar();while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans;}
inline void write(uint x){if(x>9)write(x/10);putchar((x%10)^48);}
int T;
uint mul[64],sum[64];
inline void init(){mul[0]=1,sum[0]=1;for(int i=1;i<=63;++i)mul[i]=mul[i-1]*3,sum[i]=sum[i-1]+mul[i];}
inline uint calc(ll x){
    uint ret=0,tmp=0;for(int i=63;i;--i)if(((1ll<<i)&x))ret+=sum[i-1]*(1ll<<(i-1)),ret+=tmp*(1ll<<i),ret+=mul[i],tmp+=mul[i];
    if(x&1)ret+=tmp+1;return ret;
}
int main(){
    T=read(),init();
    while(T--){ll a=read(),b=read();write(calc(b)-calc(a-1)),puts("");}
    return 0;
}

2018.08.19 NOIP模拟 number(类数位dp)的更多相关文章

  1. 2018.08.18 NOIP模拟 game(数位dp)

    Game 题目背景 SOURCE:NOIP2015-SHY4 题目描述 Alice 和 Bob 正在玩一个游戏,两个人从 1 轮流开始报数,如果遇到 7 的倍数或者遇到的这个数的十进制表示中含 7 , ...

  2. 2018.06.26 NOIP模拟 号码(数位dp)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的 ...

  3. 2018.08.19 NOIP模拟 change(简单模拟)

    Change 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 Alice 和 Bob 又聚在一起了!他们已经厌倦了取石子游戏,现在他们热衷于切题.于是,Alice 找到了一道题让 B ...

  4. 2018.08.19 NOIP模拟 dp(二分+状压dp)

    Dp 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 一块土地有 n 个连续的部分,用 H[1],H[2],-,H[n] 表示每个部分的最初高度.有 n 种泥土可用,他们都能覆盖连续 ...

  5. 2018.08.22 NOIP模拟 string(模拟)

    string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...

  6. 2018.08.30 NOIP模拟 graph(dfs序/树剖+线段树)

    [描述] 给你一个图,一共有 N 个点,2*N-2 条有向边. 边目录按两部分给出 1. 开始的 n-1 条边描述了一颗以 1 号点为根的生成树,即每个点都可以由 1 号点 到达. 2. 接下来的 N ...

  7. 2018.08.30 NOIP模拟 wall(模拟)

    [问题描述] 万里长城是中国强大的标志,长城在古代的用途主要用于快速传递军事消息和抵御 外敌,在长城上的烽火台即可以作为藏兵的堡垒有可以来点燃狼烟传递消息. 现在有一段 万里长城,一共有 N 个烽火台 ...

  8. 2018.08.21 NOIP模拟 xorand(01trie)

    xorand 描述 有q次操作,每次操作是以下两种: 1. 加入一个数到集合中 2. 查询,查询当前数字与集合中的数字的最大异或值,最大and值,最大or值 输入 第一行1个正整数Q表示操作次数 接下 ...

  9. 2018.10.19 NOIP模拟 比特战争(kruskal)

    传送门 考完发现是sbsbsb题啊. 直接考虑优化状压的转移. 可以证明最优解一定在求最小生成树的时候取得. 因此再最小生成树时维护一下连通块的最值统计答案就行了. 代码

随机推荐

  1. cookie和session的比较

    cookie和session的比较 一.对于cookie: ①cookie是创建于服务器端 ②cookie保存在浏览器端 ③cookie的生命周期可以通过cookie.setMaxAge(2000); ...

  2. json小知识

    json转换新方法 上面是把一个json数组转换成map集合 fromObject()是通用的 map集合,bean对象,String转换成json 文件转换成字符串,在转换成json 生成json文 ...

  3. delphi Firemonkey ListBoxItem自绘

    delphi Firemonkey ListBoxItem自绘 ListBoxItem1的事件ListBoxItem1Paint procedure TForm1.ListBoxItem1Paint( ...

  4. Spring Boot @Trasactionl 失效, JDK,CGLIB动态代理

    来自: https://www.cnblogs.com/sweetchildomine/p/6978037.html?utm_source=itdadao&utm_medium=referra ...

  5. as3 三行三列 布满9个为一个界面

    var n:int=int(iconIndex/3); e.x =(int(n/3)*3+iconIndex%3)*557; e.y = int(iconIndex / 3) % 3 * 260; i ...

  6. 数学公式 AS3应用

    普通做法: var pA:Point=new Point(100,100); var pB:Point=new Point(300,200); var dx:Number=pA.x-pB.x; var ...

  7. ios 缩放动画

    CABasicAnimation *buttonAni = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; ...

  8. 关于gevent的一些理解(二)

    3 实际应用 1 zeromq和gevent: zeromq的介绍请参看:http://www.infoq.com/cn/news/2010/09/introduction-zero-mq 假设你已经 ...

  9. centos7 防火墙配置

    firewall-cmd --zone=public --add-port=80/tcp --permanentfirewall-cmd --zone=public --add-port=8080/t ...

  10. win10磁盘碎片整理

    如果我们想要加快win10系统运行速度的话,就需要定期整理碎片才可以,减少卡顿,提高性能. 一:注意事项 固态硬盘用户千万不要使用‘磁盘碎片整理功能’,因为使用的技术不一样,使用window自带的该功 ...