时间限制: 2000 ms 空间限制: 256000 KB
题目描述
有一把幸运锁,打开它将会给你带来好运,但开锁时需要输入一个正整数(没有前导0)。幸运锁有一种运算,对于一个正整数,返回他的相邻两位数字间的差,如1135,运算结果为22(会去掉前导0)。
现在已知只有经过反复运算最终结果为7的数才能打开这把锁,给你一个区间[a,b],问该区间中有多少个能打开幸运锁的幸运数。
输入
第一行两个整数a,b。
输出
一个整数K,表示共有多少个这样的数。
样例输入
样例输出
数据范围限制
【限制】
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; }
|
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 暗影小站! 注: 本博客暂不开设评论区,请使用邮件119548583@qq.com联系