ABC181D Hachi / Lyrith -迷宮リリス-【模拟】【数学】

>Link

ABC181D

luogu T207968


>Description

问是否有一种方案,将十进制数 x x x 重排后,新的数为 8 的倍数

x ≤ 1 0 100000 x\le 10^{100000} x10100000


>解题思路

把十进制下每一位上的数提出来看,设 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=an10n1+...+a41000+a3100+a210+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;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/121236076
今日推荐