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. scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class

    转自:https://blog.csdn.net/lzj0470/article/details/17786587 quartz版本号:2.1.7 错误: Caused by: <a href= ...

  2. CentOS 7 Tomcat安装

    官网: http://tomcat.apache.org/download-80.cgi 下 1.载zip包 >wget http://mirrors.hust.edu.cn/apache/to ...

  3. 修改默认的inout输入框背景颜色

    https://www.cnblogs.com/beileixinqing/p/6119690.html

  4. mysql大表优化

    https://segmentfault.com/a/1190000006158186 https://tech.meituan.com/mysql-index.html http://www.cnb ...

  5. 系统批量运维管理器pexpect的使用

    # pip install pexpect 或 # easy_install pexpect 1 #!/usr/bin/env python 2 import pexpect 3 child = pe ...

  6. How to Pronounce SAY, SAYS, and SAID

    How to Pronounce SAY, SAYS, and SAID Share Tweet Share Tagged With: Comparison I’ve noticed many non ...

  7. 正则表达式(Swift)

    课题 使用正则表达式匹配字符串 使用正则表达式 "\d{3}-(\d{4})-\d{2}" 匹配字符串 "123-4567-89" 返回匹配结果:'" ...

  8. Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数

    Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数~~~    呵呵... 看着有点晕.. 再解释一下就是 在Unity中 使用 C# 调用 C++ 写的 DLL, 但是在 ...

  9. Hive—学习笔记(一)

    主要内容: 1.Hive的基本工能机制和概念 2.hive的安装和基本使用 3.HQL 4.hive的脚本化运行使用方式 5.hive的基本语法--建表语法 6.hive的基本语法--内部表和外部表. ...

  10. Maven命令行使用 mvn clean package

    先把命令行切换到Maven项目的根目录,比如:/d/xxxwork/java/maven-test,然后执行命令:  mvn clean package 执行结果如下: [INFO] Scanning ...