>Link
ABC181D
luogu T207968
>Description
问是否有一种方案,将十进制数 x x x 重排后,新的数为 8 的倍数
x ≤ 1 0 100000 x\le 10^{100000} x≤10100000
>解题思路
把十进制下每一位上的数提出来看,设 x x x 拆出来为 a n . . . a 1 a_n...a_1 an...a1
那 x = a n ∗ 1 0 n − 1 + . . . + a 4 ∗ 1000 + a 3 ∗ 100 + a 2 ∗ 10 + a 1 x=a_n*10^{n-1}+...+a_4*1000+a_3*100+a_2*10+a_1 x=an∗10n−1+...+a4∗1000+a3∗100+a2∗10+a1
我们发现 1000 已是 8 的倍数(125*8=1000),所以我们只要使得最小的三位组成的数为8的倍数就行了
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
int n, cnt[20], x, y, tot, a[5], sum[20];
char c;
int main()
{
c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
{
cnt[c - '0']++, n++;
c = getchar();
}
bool ok = 1;
for (int i = 0; i <= 200; i++)
{
x = i * 8; ok = 1;
memset (sum, 0, sizeof (sum));
for (int j = 1; j <= 3; j++)
{
a[j] = x % 10;
x /= 10;
}
if (x) break;
if (n >= 3)
{
for (int j = 1; j <= 3; j++)
{
sum[a[j]]++;
if (sum[a[j]] > cnt[a[j]]) ok = 0;
}
if (!ok) continue;
printf ("YES\n");
for (int j = 0; j <= 9; j++)
for (int t = 1; t <= cnt[j] - sum[j]; t++)
putchar (j + '0');
for (int j = 3; j >= 1; j--)
putchar (a[j] + '0');
return 0;
}
else if (n == 2)
{
if (a[3] != 0) continue;
sum[a[1]]++, sum[a[2]]++;
if (sum[a[1]] > cnt[a[1]] || sum[a[2]] > cnt[a[2]])
continue;
printf ("YES\n");
putchar (a[2] + '0'), putchar (a[1] + '0');
return 0;
}
else if (n == 1)
{
if (a[3] != 0 || a[2] != 0) continue;
if (!cnt[a[1]]) continue;
printf ("YES\n");
putchar (a[1] + '0');
return 0;
}
}
printf ("NO");
return 0;
}