-
- 89通过
- 233提交
- 题目提供者该用户不存在
- 标签USACO
- 难度普及/提高-
讨论 题解
最新讨论
- 暂时没有讨论
题目描述
循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质, 就像这个例子:
如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一个新的数字(如果停在一个相同的数字上,这个数就不是循环数).就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6
重复这样做 (这次从“6”开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2
再这样做 (这次数两个): 8 1
再一次 (这次一个): 3
又一次: 6 2 8 这时你回到了起点,在经过每个数字一次后回到起点的就是循环数。如果你经过每一个数字一次以后没有回到起点, 你的数字不是一个循环数。
给你一个数字 M (在1到9位之间), 找出第一个比 M大的循环数, 输出数据保证结果能用一个无符号长整型数(21亿)装下。 (追加提醒:循环数每个数位都必须要访问到)
输入输出格式
输入格式:仅仅一行, 包括M.
输出格式:仅仅一行,输出第一个比M大的循环数。
输入输出样例
输入样例#1:
81361
输出样例#1:
81362
说明
翻译来自NOCOW
USACO 2.2
分析:这道题有一半是在考语文......其实读懂了就会发现这道题就是一道枚举的水题,因为没告诉范围,所以只要找到符合条件的数就可以,关键是怎么判断,首先判重,并在判重中看看原数有没有0,然后按照题目说的性质一步一步来,注意取模就行.不过要注意的是,因为要对多个数进行处理,每次进行处理之前要先初始化数组!
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,num[11],vis1[11],vis2[11],temp,cur; bool flag = true; void fanzhuan() { int j = temp; for (int i = 1; i < j; i++) swap(num[i], num[j--]); } bool panchong(int x) { int vis[10]; memset(vis, 0, sizeof(vis)); while (x) { if (x % 10 == 0) return false; if (vis[x % 10]) return false; vis[x % 10] = 1; x /= 10; } return true; } bool check(int x) { memset(num, 0, sizeof(num)); memset(vis1, 0, sizeof(vis1)); memset(vis2, 0, sizeof(vis2)); temp = 1; while (x) { if (vis1[(num[temp] = x % 10)]) return false; vis1[num[temp++]] = true; x /= 10; } temp--; fanzhuan(); cur = 1; while (!vis2[num[cur]]) { vis2[num[cur]] = 1; cur += num[cur] % temp; if (cur > temp) cur %= temp; } if (num[cur] != num[1]) return false; for (int i = 1; i <= temp; i++) if (!vis2[num[i]]) return false; return true; } int main() { scanf("%d", &n); int i = n + 1; while (1) { if (panchong(i)) if (check(i) == true) break; i++; } printf("%d ", i); return 0; }