Pagini recente » Monitorul de evaluare | Cod sursa (job #2078216) | Cod sursa (job #1081497) | Cod sursa (job #337556) | Cod sursa (job #796843)
Cod sursa(job #796843)
#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 int mod (int a [ ], int b)
{
int reminder(0);
for (int *iterator(a + *a) ; iterator > a ; --iterator)
reminder = (reminder * 10 + *iterator) % b;
return reminder;
}
inline void add (int a [ ], int 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)
{
if (d > 1)
{
int reminder(mod(number,d));
if (reminder)
{
d -= reminder;
add(number,d);
}
}
}
int main (void)
{
read();
compute();
print();
return 0;
}