【AtCoder ADT】
log2、逆フィボナッチ、ビット列
(EASY 2026/04/28 16:00)

関連記事

1. A – ABC400 Party

割り切れるかどうかを判定し、割り切れるなら商を、そうでなければ -1 を返します。

(defun party-p (n a)
  (if (= (mod n a) 0)
       (floor n a)
       -1))

(defun main ()
  (princ (party-p 400 (read))))

#-swank(main)Code language: Lisp (lisp)
1. A  – ABC400 Party

2. B – Contest Result

配点と解いた問題の一覧から、総得点を計算しました。

(defun total-point (An Bm)
  (loop for i across (remove-duplicates Bm)
	sum (aref An (1- i))))

(defun read-fixnums (N)
  (loop with vec = (make-array N :element-type 'fixnum)
	for i below N
	do (setf (aref vec i) (read))
	finally (return vec)))

(defun main ()
  (let* ((N (read))
	 (M (read))
	 (An (read-fixnums N))
	 (Bm (read-fixnums M)))
    (princ (total-point An Bm))))

#-swank(main)
Code language: Lisp (lisp)
2. B – Contest Result

3. C – log2(N) (WA2)

整数値での対数を計算します。

(defun log2n (n)
  (floor (log n 2)))

(defun main ()
  (princ (log2n (read))))

#-swank(main)Code language: Lisp (lisp)
3. C – log2(N) (WA2)

3.1. 整数で計算した

小数誤差の問題があったようなので、整数値で計算しました。

(defun log2n/time (n)
  (loop with x = n
	for i from 0
	while (> x  1)
	do (setf x (floor x 2))
	   finally (return i)
	))

(defun main ()
  (princ (log2n/time (read))))

#-swank(main)Code language: Lisp (lisp)
3.1. 整数で計算した

4. D – Fibonacci Reversed

数字の各桁を逆転させる操作があります。

(defun f-rev (n)
  (list->num (reverse (num->list n))))

(defun num->list (n)
  (loop with x = n
	while (> x 0)
	collect (mod x 10)
	do (setf x (floor x 10))))

(defun list->num (lst)
  (loop for n in lst
	for i from 0
	sum (* n (expt 10 i))))

(defun fib-rev (n dp x y)
  (cond ((gethash n dp))
	((= n 1) x)
	((= n 2) y)
	(t (setf (gethash n dp)
		 (f-rev (+ (fib-rev (- n 1) dp x y)
			   (fib-rev (- n 2) dp x y)))))))
(defun main ()
  (princ (fib-rev 10 (make-hash-table) (read) (read))))

#-swank(main)
Code language: Lisp (lisp)
4. D – Fibonacci Reversed

5. E – Many Balls

数字を + 1 と * 2 を組み合わせて作る問題です。
2進数表示にしてから、操作順序を決めます。

(defun num->bits (n)
  (loop with x = n
	while (> x 0)
	collect (mod x 2)
	do (setf x (floor x 2))))

(defun big-endian-bits (n)
  (reverse (num->bits n)))

(defun magic-list (n)
  (loop for bit in (big-endian-bits n)
	with stack = nil
	when (= bit 1)
	  do (push #\A stack)
	do (push #\B stack)
	finally (pop stack)
		(return (coerce (reverse stack) 'string)) ))

(defun main ()
  (princ (magic-list (read))))Code language: Lisp (lisp)
5. E – Many Balls

最後は7分オーバーの時間切れで、4問正解でした。

5. E – Many Balls
5. E – Many Balls