 long long last_X_in_segment = (seg2_end_X / k) * k + r;

            if (last_X_in_segment > seg2_end_X) {

                last_X_in_segment -= k;

            }



            if (first_X_in_segment <= last_X_in_segment) {

                long long num_terms = (last_X_in_segment - first_X_in_segment) / k + 1;

                // Все значения num_cells(X) в этом сегменте равны n

                current_r_sum += num_terms * n;

            }

        }



        // --- Сегмент 3: X от m до n+m-2, num_cells(X) = n+m-1-X ---

        long long seg3_start_X = m;

        long long seg3_end_X = n + m - 2;



        if (seg3_start_X <= seg3_end_X) {

            // Находим первое X в этом сегменте

            long long first_X_in_segment = (seg3_start_X / k) * k + r;

            if (first_X_in_segment < seg3_start_X) {

                first_X_in_segment += k;

            }



            // Находим последнее X в этом сегменте

            long long last_X_in_segment = (seg3_end_X / k) * k + r;

            if (last_X_in_segment > seg3_end_X) {

                last_X_in_segment -= k;

            }



            if (first_X_in_segment <= last_X_in_segment) {

                long long num_terms = (last_X_in_segment - first_X_in_segment) / k + 1;

                long long first_val = n + m - 1 - first_X_in_segment; // num_cells(first_X)

                long long last_val = n + m - 1 - last_X_in_segment;   // num_cells(last_X)

                current_r_sum += (num_terms * (first_val + last_val)) / 2;

            }

        }

        ans[r] = current_r_sum;

    }



    // Выводим результаты

    for (long long i = 0; i < k; ++i) {

        std::cout << ans[i] << (i == k - 1 ? "" : " ");

    }

    std::cout << std::endl;



    return 0;

}