洛谷题目连接:魔法指纹

题目描述

对于任意一个至少两位的正整数n,按如下方式定义magic(n):将n按十进制顺序写下来,依次对相邻两个数写下差的绝对值。这样,得到了一个新数,去掉前导0,则定义为magic(n)。若n为一位数,则magic(n)=n。

例如:magic(5913)=482,magic(1198)=081=81,magic(666)=00=0。

对任意一个数n,序列n,magic(n),magic(magic(n)),…迟早会变成一个一位数。最后的这个值称为数n的magic指纹。

例如,对于n=5913,我们得到序列:5913,482,46,2。所以5913的magic指纹为2。

若一个数的magic指纹为7,则认为这个数是个幸运数。

现在,给定A,B,计算出[A,B]中有多少个数是幸运数。

输入输出格式

输入格式:

输入两行,每行一个数。第一行是A,第二行表示B。

输出格式:

输出[A,B]中有多少个数是幸运数。

输入输出样例

输入样例#1:

1

9

输出样例#1:

1

说明

数据范围:

对30%数据,B≤10000。

对100%数据,0<A≤B≤1,000,000,000。


一句话题意: 根据描述的方法来转换数字,最后转换到只剩下个位的时候判断这个数字是否能计入答案.


题解: 首先看这数据范围,10个亿??这显然是一个玄学的复杂度.我们先考虑如何暴力来算.

  • 最朴素的算法,直接枚举\(a\)~\(b\)的每一个数字验证,复杂度\(O(n*len)\),\(len\)为数字最大位数,也就是10.
  • 考虑优化一下暴力,加上一个记忆化搜索, 复杂度\(O(n*k)\), k是一个小于等于10的常数.

显然如果要枚举的话,得到的复杂度至少也是\(O(n)\)的,所以才说这个小于\(O(n)\)的复杂度很玄学,所以我们还得再优化.

正解:分块+打表

可以考虑直接将整块内的答案通过另一个程序打出来,然后暴力统计不在整块内的,直接加整块内的答案.

打表的话就直接用一个什么暴力算一下就可以了.

#include<bits/stdc++.h>
using namespace std; int block;
int n, num[20], ans[40000] = {/*这里实在是太多了就不贴了*/}; int magic(int x){
if(x < 10) return x == 7 ? 1 : -1;
int cnt = 0, res = 0;
for(;x;x/=10) num[++cnt] = x%10;
for(int i=1;i<=cnt/2;i++) swap(num[i], num[cnt-i+1]);
for(int i=2;i<=cnt;i++) res = res*10+abs(num[i]-num[i-1]);
return magic(res);
} int B(int pos){return (pos-1)/block+1;}//计算一个位置属于哪个块 int main(){
//freopen("data.in", "r", stdin);
//freopen("zuoti.out", "w", stdout);
int a, b, res = 0; cin >> a >> b;
block = 31662+1;//对10亿开根的结果
for(int i=a;i<=min(b, B(a)*block);i++)
if(magic(i) == 1) res++;
for(int i=B(a)+1;i<=B(b)-1;i++) res += ans[i];
for(int i=(B(b)-1)*block+1;i<=b && B(a) != B(b);i++)
if(magic(i) == 1) res++;
printf("%d\n", res);
return 0;
}

[洛谷P1822] 魔法指纹的更多相关文章

  1. 洛谷P1822 魔法指纹 【分块打表】

    题目 对于任意一个至少两位的正整数n,按如下方式定义magic(n):将n按十进制顺序写下来,依次对相邻两个数写下差的绝对值.这样,得到了一个新数,去掉前导0,则定义为magic(n).若n为一位数, ...

  2. 洛谷 U87561 魔法月饼

    洛谷 U87561 魔法月饼 洛谷传送门 题目背景 \(9102\)年的中秋节注定与往年不同...因为在\(9102\)年的中秋节前夕,\(Seaway\)被告知今年的中秋节要新出一款月饼--魔法月饼 ...

  3. 洛谷 P1583 魔法照片

    P1583 魔法照片 题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初 ...

  4. 洛谷—— P2387 魔法森林

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...

  5. P1822 魔法指纹

    一道放在分块训练中的分块打表屑题 看了神NaCly_Fish的题解学了间隔打表(话说这么屑的东西有什么学的必要吗) 内容大多摘自大佬的题解 1,答案可递推,才适合间隔打表 什么叫可递推呢?假设f[n] ...

  6. 洛谷 P1583魔法照片 & P1051谁拿了最多奖学金 & P1093奖学金

    题目:https://www.luogu.org/problemnew/show/P1583 思路:sort sort sort //#include<bits/stdc++.h> #in ...

  7. 洛谷 P1583 魔法照片【二级结构体排序】

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...

  8. (水题)洛谷 - P1583 - 魔法照片

    https://www.luogu.org/problemnew/show/P1583 设计一个strcut cmp用来比较,就可以了. #include<bits/stdc++.h> u ...

  9. 洛谷P1583 魔法照片【模拟+排序】

    一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序,每人就有 ...

随机推荐

  1. 使用HTML5制作loading图

    昨天发了一篇使用HTML5 canvas写的时钟的文章,今天发一篇关于使用HTML5制作loading图的文章. <!DOCTYPE html> <html> <head ...

  2. 如果jsp表单元素的值为空,如何避免null出现在页面上?

    可以写一个简单的函数对空值进行处理,判断值是否为空,如果是空就返回空字符串.实例代码如下: <%! String blanknull(String s) { return (s == null) ...

  3. Microsoft.Practices.EnterpriseLibrary

    项目中使用了Microsoft.Practices.EnterpriseLibrary这个东西,根据名字猜测和微软有关系(可以翻译为:微软实践企业库). 看到了引入了两个命名空间: using Mic ...

  4. lintcode-138-子数组之和

    138-子数组之和 给定一个整数数组,找到和为零的子数组.你的代码应该返回满足要求的子数组的起始位置和结束位置 注意事项 There is at least one subarray that it' ...

  5. lintcode-14-二分查找

    二分查找 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 在数组 ...

  6. winform 删除,清空指定文件夹上的所有文件或文件夹

    //递归删除文件夹及子文件C#代码: public void DeleteFolder(string dir) { if (Directory.Exists(dir)) //如果存在这个文件夹删除之 ...

  7. 【Docker 命令】- run命令

    docker run :创建一个新的容器并运行一个命令 语法: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS说明: -a stdin: 指 ...

  8. 【Redis】- 缓存击穿

    什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义.如果 ...

  9. css的存在形式及优先级

    1. 查看源代码---在谷歌浏览器中右击-->点检查 2. CSS中style优先级,标签上的style优先,其它按照编写顺序越更新越优先,后面的会把前面的覆盖掉. 3. 如果想在其它的html ...

  10. javascript中的this作用域详解

    javascript中的this作用域详解 Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大.在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉 ...