;; エレガントかどうか知らんけど、最終行でも動作が変わらないようにしてみました
(defun duplicate-line (n)
(interactive "p")
(save-excursion
(let ((str (concat (buffer-substring (line-beginning-position)
(line-end-position))
"\n")))
(forward-line)
(when (= (line-end-position)
(point-max))
(insert "\n"))
(dotimes (i n)
(insert str)))))