const int BASE = 1e9; // k=9 // n/k /** Mul ---> FFT: BASE, n ---> BASE^2 * n (3 умножения) BASE^2 * n <= 10^{15} | long double подойдёт 10^5 BASE=10^5 */ Div(an, a, bn, b) // [0..an] [0..bn] a[i]*10^i // a[an] != 0 for (j=an-bn; j >= 0; j--) c[j] = (a[an-j]*BASE+a[an-1-j])/(b[bn]*BASE+b[bn-1]+1) for (int i = 0; i <= bn; i++) a[i+j] -= b[i]*c[j]; // и сделать переносы // if (a[i+j]<0) a[i+j]+=BASE, a[i+j]-- // c[j] может быть неверно посчитано while a >= b shift j c[j]++ a -= b shift j a[an-j-1] += a[an-j]*BASE a[an-j] = 0