luogu T207968 Lyrith -迷宮リリス-
Description–
有一个数字 x x x
问是否存在一种方案,将数字 x x x 重排后,是 8 8 8 的倍数。
重排指的是将
x
x
x 十进制下每一位拿出来,然后重新排列他们的顺序,最后再次组成一个十进制数
x
′
x'
x′。
注意这个新的十进制数
x
′
x'
x′ 可以有前导零。
Input–
输入一个正整数 x x x
Output–
如果可以重排 x x x 使得 x x x 是 8 8 8 的倍数,那么第一行输出 Y E S YES YES,第二行输出重排后的 x x x;如果不行,只需要在第一行输出 N O NO NO 即可。
若有多种可行方案,只需要输出任意一种即可。
Sample Input–
12345
Sample Output–
YES
34152
说明–
解题思路–
后三位是 8 8 8 的倍数的数就是 8 8 8 的倍数
代码–
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
string s;
bool pd[1100];
int p[15];
void lc()
{
int x = 8;
while (x <= 1000)
pd[x] = 1, x += 8;
}
void hll(int a, int b, int c)
{
printf("YES\n");
for (int i = 0; i <= 9; ++i)
while (p[i]) printf("%d", i), p[i]--;
printf("%d%d%d", c, b, a);
}
int main()
{
lc(), cin >> s;
for (int i = 0; i < (int)s.size(); ++i)
p[s[i] - '0']++;
for (int i = 8; i <= 1000; ++i)
if (pd[i])
{
int a = i % 10, b = i % 100 / 10, c = i % 1000 / 100;
int aa = p[a], bb = p[b], cc = p[c];
if (p[a])
{
p[a]--;
if (p[b])
{
p[b]--;
if (p[c])
{
p[c]--, hll(a, b, c);
return 0;
}
}
}
p[a] = aa, p[b] = bb, p[c] = cc;
}
printf("NO");
return 0;
}