input:lucky.in output:lucky.out

时间限制: 2000 ms 空间限制: 256000 KB

题目描述

有一把幸运锁,打开它将会给你带来好运,但开锁时需要输入一个正整数(没有前导0)。幸运锁有一种运算,对于一个正整数,返回他的相邻两位数字间的差,如1135,运算结果为22(会去掉前导0)。

现在已知只有经过反复运算最终结果为7的数才能打开这把锁,给你一个区间[a,b],问该区间中有多少个能打开幸运锁的幸运数。

输入

第一行两个整数a,b。

输出

一个整数K,表示共有多少个这样的数。

样例输入

1
1 10

样例输出

1
1

数据范围限制

【限制】

1<=a<=b<=10^9。

30%的数据有b<=10^6。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <bits/stdc++.h>
using namespace std;
int readint() {
int x = 0;
char c = getchar();
for (; c < '0' || c > '9'; c = getchar());
for (; c >= '0' && c <= '9'; c = getchar()) x = (x * 10) + (c - '0');
return x;
}
long long toVal(string s) {
long long sum = 0;
for (int i = 0; s[i]; ++i)
sum = (sum * 10) + (s[i] - '0');
return sum;
}
const int MAXN = 170000 + 5;
int x, y, hd, tl, len, ans;
string s, d[MAXN];
void dfs(int pos)
{
long long tmp = 0;
if (pos == len)
{
tmp = toVal(s);
int addnum = 0;
for (; tmp <= y;)
{
d[++tl] = s;
if (tmp >= x && tmp <= y) ++ans;

s = s[0] + s;
++addnum;
tmp = toVal(s);
}
s.erase(0, addnum);
return;
}
tmp = (s[pos] - '0') + (d[hd][pos] - '0');
if (tmp <= 9)
{
s += (char)(tmp + '0');
dfs(pos + 1);
s.erase(pos + 1, 1);
}
tmp = s[pos] - d[hd][pos];
if (tmp >= 0 && d[hd][pos] != '0')
{
s += (char)(tmp + '0');
dfs(pos + 1);
s.erase(pos + 1, 1);
}
}
int main()
{
freopen("lucky.in", "r", stdin);
freopen("lucky.out", "w", stdout);
x = readint();
y = readint();
d[tl = 1] = "7";
if (x <= 7 && y >= 7) ++ans;
for (; hd < tl;)
{
len = d[++hd].size();
for (char c = '1'; c <= '9'; ++c) {
s = c;
dfs(0);
}
}
printf("%d\n", ans);
fclose(stdin);
fclose(stdout);
return 0;
}