#include <algorithm>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <stack>
#define MAXDIGIT 3000
#define BAZA ((long long)(1ULL << 32))
#define BAZAPRINT (unsigned int)(1e9)
struct nrMare {
unsigned int dig[MAXDIGIT / 8];
int nrD;
void scan(std::istream &fin) {
clear();
std::string buf;
fin >> buf;
for (int i = 0; i < buf.size(); i++) {
multiplyInt(10);
addInt(buf[i] - '0');
}
}
void print(FILE *fout) { // printeaza nr in fout
// nrMare aux;
// aux.copy(*this); // auxiliar ca sa nu fie distructiva functia si pur
// si
// simplu sa printeze
std::stack<int> rez; // stiva temporara sa tin digitele in minte
if (nrD == 0)
fprintf(fout, "0");
while (nrD)
rez.push(divide(BAZAPRINT));
fprintf(fout, "%d", rez.top());
rez.pop();
while (!rez.empty()) {
fprintf(fout, "%09d", rez.top());
rez.pop();
}
// this->copy(aux);
}
void multiplyInt(int b) {
int i;
unsigned long long t = i = 0;
while (i < nrD || t > 0) {
t += (unsigned long long)b * (unsigned long long)dig[i];
dig[i] = (unsigned int)t;
t = t >> 32;
++i;
}
nrD = std::max(i, nrD);
}
/*void multiplyHuge( const nrMare& b){
int i,j;
unsigned long long t = i = 0;
while(i < b.nrD || t > 0) {
t = j = 0;
while(i < nrD || t > 0){
t += (unsigned long long)b.dig[i] + (unsigned long long)dig[i];
dig[i] = (unsigned int)t;
t = t >> 32;
++i;
}
}
}*/
int divide(unsigned long long a) {
unsigned long long t = 0;
for (int i = nrD - 1; i >= 0; i--) {
t = t * BAZA + dig[i];
dig[i] = t / a;
t %= a;
}
while (nrD > 0 && dig[nrD - 1] == 0)
nrD--;
return t; // returneaza modulul
}
void add(const nrMare &a) {
int i;
unsigned long long t = i = 0;
while (i < nrD || i < a.nrD || t > 0) {
t += (unsigned long long)a.dig[i] + (unsigned long long)dig[i];
dig[i] = (unsigned int)t;
t = t >> 32;
++i;
}
nrD = std::max(i, nrD);
nrD = std::max(a.nrD, nrD);
}
void addInt(unsigned long long a) {
int i;
unsigned long long t = i = 0;
while (a) {
t += (unsigned long long)dig[i] + (unsigned int)a;
dig[i] = (unsigned int)t;
t = t >> 32;
++i;
a = a >> 32;
}
nrD = std::max(i, nrD);
}
inline void clear() {
memset(dig, 0, sizeof(dig[0]) * (MAXDIGIT / 8));
nrD = 0;
}
void set(int a) {
clear();
dig[0] = a;
nrD = 1;
}
// baga a in nr mare curent (operatorul = )
void copy(const nrMare &a) {
clear();
for (int i = 0; i < a.nrD; i++)
dig[i] = a.dig[i];
nrD = a.nrD;
}
}; // stiu ca structul e cam bloated dar poate imi va trebui in alta problema si
// doar dau copy paste
int main() {
FILE *fout;
std::ifstream fin("next.in");
fout = fopen("next.out", "w");
unsigned long long d, mod;
nrMare n, aux; // aux, pt ca functia divide e distructiva
n.scan(fin);
fin >> d;
aux.copy(n);
mod = n.divide(d);
aux.addInt(d - mod);
aux.print(fout);
return 0;
}