Cod sursa(job #796846)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 12 octombrie 2012 19:12:35
Problema Next Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb

#include <cstdio>

const int MAX_SIZE(1000002);

char string [MAX_SIZE];
int number [MAX_SIZE];
unsigned long long d;

inline int length (void)
{
	int left(0), right(MAX_SIZE), middle;
	while (true)
	{
		middle = (left + right) >> 1;
		if (string[middle])
		{
			if (string[middle + 1])
				left = middle + 1;
			else
			{
				++middle;
				break;
			}
		}
		else
		{
			if (string[middle - 1])
				break;
			else
				right = middle;
		}
	}
	return middle;
}

inline void read (void)
{
	std::freopen("next.in","r",stdin);
	std::scanf("%s",string);
	std::scanf("%llu",&d);
	std::fclose(stdin);
	*number = length();;
	for (int index1(*number - 1), index2(1) ; index1 >= 0 ; --index1, ++index2)
		number[index2] = string[index1] - '0';
}

inline void print (void)
{
	std::freopen("next.out","w",stdout);
	for (int index(*number) ; index ; --index)
		std::putchar(number[index] + '0');
	std::putchar('\n');
	std::fclose(stdout);
}

inline unsigned long long mod (int a [ ], unsigned long long b)
{
	unsigned long long reminder(0);
	for (int *iterator(a + *a) ; iterator > a ; --iterator)
		reminder = (reminder * 10 + *iterator) % b;
	return reminder;
}

inline void add (int a [ ], unsigned long long b)
{
	int index(1), reminder(0);
	for (int size(*a) ; index <= size || b || reminder ; ++index, b /= 10, reminder /= 10)
		a[index] = (reminder += a[index] + (b % 10)) % 10;
	*a = index - 1;
}

inline void compute (void)
{
	int reminder(mod(number,d));
	if (reminder)
	{
		d -= reminder;
		add(number,d);
	}
}

int main (void)
{
	read();
	compute();
	print();
	return 0;
}