```ts
/**
 * Expands a monthly recurrence rule over a span of months using only integer arithmetic.
 * @param ordinal - The ordinal-th occurrence of a weekday (1 through 5, or -1 meaning the final occurrence).
 * @param weekday - The weekday to pick (0 is Monday through 6 for Sunday).
 * @param start - The starting month in zero-padded "YYYY-MM" format.
 * @param months - The number of consecutive months to cover.
 * @returns An array of selected dates as zero-padded "YYYY-MM-DD" strings in chronological order.
 */
export function expandNthWeekday(ordinal: number, weekday: number, start: string, months: number): string[] {
    if (![-1, 1, 2, 3, 4, 5].includes(ordinal)) {
        throw new Error("Invalid ordinal");
    }
    if (weekday < 0 || weekday > 6) {
        throw new Error("Invalid weekday");
    }
    const startMatch = /^(\d{4})-(\d{2})$/.exec(start);
    if (!startMatch) {
        throw new Error("Invalid start date format");
    }
    const [yearStr, monthStr] = startMatch.slice(1).map(Number);
    if (yearStr < 1 || yearStr > 9999 || monthStr < 1 || monthStr > 12) {
        throw new Error("Invalid start date");
    }
    if (months <= 0 || months > 240) {
        throw new Error("Invalid number of months");
    }

    const isLeapYear = (year: number): boolean => (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
    const daysInMonth = (year: number, month: number): number => {
        switch (month) {
            case 2: return isLeapYear(year) ? 29 : 28;
            case 4: case 6: case 9: case 11: return 30;
            default: return 31;
        }
    };

    const results: string[] = [];
    for (let i = 0; i < months; i++) {
        const currentYear = yearStr + Math.floor((monthStr - 1 + i) / 12);
        const currentMonth = ((monthStr - 1 + i) % 12) + 1;
        const firstDayOfWeek = (3 + 5 * (currentYear % 4) + 4 * (currentYear % 100) + 6 * (currentYear % 400)) % 7; // Zeller's congruence
        const daysCount = daysInMonth(currentYear, currentMonth);

        let targetDays: number[] = [];
        for (let day = 0; day < daysCount; day++) {
            if ((firstDayOfWeek + day) % 7 === weekday) {
                targetDays.push(day + 1);
            }
        }

        let selectedDay: number | null = null;
        if (ordinal > 0 && ordinal <= targetDays.length) {
            selectedDay = targetDays[ordinal - 1];
        } else if (ordinal === -1 && targetDays.length > 0) {
            selectedDay = targetDays[targetDays.length - 1];
        }

        if (selectedDay !== null) {
            results.push(`${currentYear.toString().padStart(4, '0')}-${currentMonth.toString().padStart(2, '0')}-${selectedDay.toString().padStart(2, '0')}`);
        }
    }

    return results;
}
```