```ts
export function divideCoefficients(
  dividend: number[],
  divisor: number[],
): number[][] {
  // Validate inputs
  if (!Array.isArray(dividend) || !Array.isArray(divisor)) {
    throw new Error("Both arguments must be arrays.");
  }
  if (dividend.some(coef => !Number.isInteger(coef) || coef < 0)) {
    throw new Error("Dividend coefficients must be non-negative integers.");
  }
  if (divisor.some(coef => !Number.isInteger(coef) || coef < 0)) {
    throw new Error("Divisor coefficients must be non-negative integers.");
  }
  if (dividend.length > 0 && dividend[dividend.length - 1] === 0) {
    throw new Error("Dividend cannot end with a zero.");
  }
  if (divisor.length === 0 || (divisor.length > 0 && divisor[divisor.length - 1] === 0)) {
    throw new Error("Divisor must be non-empty and cannot end with a zero.");
  }

  const quotient: number[] = [];
  const rest = [...dividend];

  while (rest.length >= divisor.length) {
    const leadingDividend = rest[rest.length - 1];
    const leadingDivisor = divisor[divisor.length - 1];

    if (leadingDividend % leadingDivisor !== 0) {
      throw new Error("Leading coefficient of the remainder is not an exact multiple of the divisor's leading coefficient.");
    }

    const factor = leadingDividend / leadingDivisor;
    quotient.push(factor);

    for (let i = 0; i < divisor.length; i++) {
      rest[rest.length - divisor.length + i] -= factor * divisor[i];
    }

    // Remove trailing zeros from rest
    while (rest.length > 0 && rest[rest.length - 1] === 0) {
      rest.pop();
    }
  }

  return [quotient, rest];
}
```