博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1822 魔法指纹 【分块打表】
阅读量:5087 次
发布时间:2019-06-13

本文共 2718 字,大约阅读时间需要 9 分钟。

题目

对于任意一个至少两位的正整数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]中有多少个数是幸运数。

输入格式

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

输出格式

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

输入样例

1

9

输出样例

1

提示

数据范围:

对30%数据,B≤10000。

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

题解

这解法。。无敌了

分块大法好
将区间分\(\sqrt{N}\)块,打表出每一块的答案【暴力打个1min就差不多了】
询问时\(O(\sqrt{N})\)统计,最后一块\(O(\sqrt{N}*10)\)暴力计算

这暴力太优美了

打表程序【记得先调一下再打。。别打半天打出个错的表】

#include
#include
#include
#include
#include
#define LL long long int#define REP(i,n) for (int i = 1; i <= (n); i++)#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<
<<' '; puts("");using namespace std;const int maxn = 32000,maxm = 1000000001,INF = 1000000000;inline int read(){ int out = 0,flag = 1; char c = getchar(); while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();} while (c >= 48 && c <= 57) {out = (out << 3) + (out << 1) + c - '0'; c = getchar();} return out * flag;}int cal(int n){ int x,p; while (n / 10){ x = n; p = 1; n = 0; while (x / 10) n += p * abs((x % 10) - (x / 10 % 10)),p *= 10,x /= 10; } return n;}int main(){ freopen("biao.txt","w",stdout); printf("{"); int B = (int)sqrt(1000000000),now = 0,ans = 0; for (int i = 1; i <= 1000000000; i++){ if (i / B > now) now = i / B,printf("%d,",ans),ans = 0; if (cal(i) == 7) ans++; } printf("}"); /*while (true){ int n = read(); printf("%d\n",cal(n)); }*/ return 0;}

AC程序【省略打表部分】

#include
#include
#include
#include
#include
#define LL long long int#define REP(i,n) for (int i = 1; i <= (n); i++)#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<
<<' '; puts("");using namespace std;const int maxn = 400005,maxm = 100005,INF = 1000000000;int biao[]={/*此处过于壮观,就略去了*/};int L,R;int cal(int n){ int x,p; while (n / 10){ x = n; p = 1; n = 0; while (x / 10) n += p * abs((x % 10) - (x / 10 % 10)),p *= 10,x /= 10; } return n;}int main(){ cin>>L>>R; L--; int ans = 0,T = (int)sqrt(1000000000),bl = L / T,br = R / T; for (int i = bl; i < br; i++) ans += biao[i]; for (int i = br * T; i <= R; i++) ans += (cal(i) == 7); for (int i = bl * T; i <= L; i++) ans -= (cal(i) == 7); printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/Mychael/p/8334438.html

你可能感兴趣的文章
mysql数据增删改查
查看>>
akka之种子节点
查看>>
不知道做什么时
查看>>
matlab 给某一列乘上一个系数
查看>>
密码学笔记——培根密码
查看>>
Screening technology proved cost effective deal
查看>>
MAC 上升级python为最新版本
查看>>
创业老板不能犯的十种错误
查看>>
Animations介绍及实例
查看>>
判断请求是否为ajax请求
查看>>
【POJ2699】The Maximum Number of Strong Kings(网络流)
查看>>
spring boot配置跨域
查看>>
BZOJ 1996 合唱队(DP)
查看>>
进击吧!阶乘——大数乘法
查看>>
安卓学习资料推荐-25
查看>>
Mysql数据库备份和还原常用的命令
查看>>
关于退出当前页面在火狐的一些问题
查看>>
【项目实施】项目考核标准
查看>>
spring-aop AnnotationAwareAspectJAutoProxyCreator类
查看>>
经典入门_排序
查看>>