洛谷题目连接:魔法指纹

题目描述

对于任意一个至少两位的正整数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. Keil sct分散加载文件

    官方说明:http://www.keil.com/support/man/docs/armlink/armlink_pge1401393372646.htm

  2. 团队Beta阶段事后分析

    团队Beta阶段事后分析 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件要解决用户的休闲娱乐问题,为用户提供好玩的模拟经营类的游戏,游戏主题 ...

  3. c++ string需要注意的地方

    There are multiple answers based on what you are doing with the string. 1) Using the string as an id ...

  4. TensorFlow安装解惑

    本文整理自网络,若有侵犯请告知. 1.安装环境 目前TensorFlow社区推荐的环境是Ubuntu, 但是TensorFlow同时支持Mac,Windows上的安装部署. 2.关于GPU版本 因为深 ...

  5. Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

  6. 对Android体系结构的理解--后续会补充

    1.最底层_硬件 任何Android设备最底层的硬件包括 显示屏, wifi ,存储设备 等. Android最底层的硬件会根据需要进行裁剪,选择自己需要的硬件. 2.Linux内核层 该层主要对硬件 ...

  7. iOS- 利用UIImageView自己整了个不会说话的汤姆猫

    1.实现思路 先说说我实现它的主要思路,很简单,主要利用UIImageView连续动画播放,和按钮的点击事件,就可以完成了这么一个简单的不会说话的汤姆猫. 2.实现细节 2.1.加载本地字典里保存的本 ...

  8. 封装字符串的Format操作

    相信即使再讨厌MFC的朋友也不会把厌恶牵扯到CString类上,而且CString现在也提升为ATL和MFC的共享类.用CString类,当然不能忘记它的Format方法,其用于格式化字符串.示例操作 ...

  9. Qt快速入门学习笔记(基础篇)

    本文基于Qter开源社区论坛版主yafeilinux编写的<Qt快速入门系列教程目录>,网址:http://bbs.qter.org/forum.php?mod=viewthread&am ...

  10. Java notify的使用

    半路出家学习java, 花了几分钟简单看了.在早上那个例子上稍微改了下, notify 对象上必须使用 synchronized 我的理解是在java synchronized只是个线程同步标志,但是 ...