結果
| 問題 |
No.523 LED
|
| ユーザー |
norioc
|
| 提出日時 | 2025-09-23 05:14:30 |
| 言語 | Scheme (Gauche-0.9.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 9,610 bytes |
| コンパイル時間 | 287 ms |
| コンパイル使用メモリ | 7,972 KB |
| 実行使用メモリ | 34,200 KB |
| 最終ジャッジ日時 | 2025-09-23 05:14:36 |
| 合計ジャッジ時間 | 5,149 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 5 TLE * 1 -- * 19 |
ソースコード
(use srfi.13) ; string
(use srfi.42) ; list-ec
(use scheme.list)
(use scheme.vector)
(use data.queue)
(use gauche.generator)
(use gauche.sequence)
(use util.match)
(define input read-line)
(define (read-words)
(string-split (input) " "))
(define (ii)
(string->number (input)))
(define (li)
(map string->number (read-words)))
(define-method prn* ((coll <collection>) :key (sep " "))
(for-each-with-index (^(i x)
(when (> i 0)
(display sep))
(display x))
coll)
(newline))
(define (prn . args)
(prn* args))
(define (prn-yn b)
(prn (if b "Yes" "No")))
(define-syntax ->
(syntax-rules ()
((_ init fn)
(call-with-values (^() init)
fn))
((_ init fns ...)
(call-with-values (^() init)
(apply compose (reverse (list fns ...)))))))
(define-syntax ->/prn
(syntax-rules ()
((_ x fns ...)
(-> x fns ... prn))))
(define-syntax let/g
(syntax-rules ()
((_ var body ...)
(generate (lambda (var) body ...)))))
(define-macro (do1 pat expr . body)
(let1 var (gensym)
`(do-ec (: ,var ,expr)
(mlet1 ,pat ,var
,@body))))
(define-syntax do*
(syntax-rules ()
((_ (qualifier1 qualifier2 ...) body ...)
(do-ec qualifier1 qualifier2 ... (begin body ...)))))
(define-syntax max0-ec
(syntax-rules ()
((_ qualifier ... body)
(fold-ec 0 qualifier ... body max))))
(define-method reverse ((s <string>))
(string-reverse s))
(define-method reverse ((vs <vector>))
(rlet1 res (vector-copy vs)
(vector-reverse! res)))
(define ord char->integer)
(define chr integer->char)
(define str x->string)
(define-method int ((x <integer>)) x)
(define-method int ((x <real>)) (truncate->exact x))
(define-method int ((s <string>))
(let1 v (string->number s)
(if (exact-integer? v)
v
(errorf "invalid string for integer: ~w" s))))
(define-method int ((c <char>))
(if (char-numeric? c)
(digit->integer c)
(errorf "invalid char for integer: ~w" c)))
(define (minmax . xs)
(values->list (apply min&max xs)))
(define (sum xs)
(fold + 0 xs))
(define (prod xs)
(fold * 1 xs))
(define (divmod a b)
(values->list (div-and-mod a b)))
(define (ceildiv a b)
(div (+ a (1- b)) b))
(define (divide? a b)
(zero? (mod a b)))
(define (1+ n) (+ n 1))
(define (1- n) (- n 1))
(define (!= a b) (not (= a b)))
(define (midpoint a b) (div (+ a b) 2))
(define pow
(case-lambda
((a b) (expt a b))
((a b m) (expt-mod a b m))))
(define sq square)
(define isqrt exact-integer-sqrt)
(define (sq? n)
(let1 x (isqrt n)
(= (sq x) n)))
(define def define)
(define len size-of)
(define pos? positive?)
(define neg? negative?)
(define == equal?)
(define ++ string-append)
(define all every)
(define any-ec any?-ec)
(define all-ec every?-ec)
(define concat concatenate)
(define foldl fold-left)
(define (pairwise xs)
(zip xs (cdr xs)))
(define-method indexed ((coll <collection>) :optional (start 0))
(list-ec (: x (index i) coll)
(list (+ i start) x)))
(define (comb n k)
(if (or (< k 0) (> k n))
0
(let loop ((i 0)
(x 1))
(if (= i k)
x
(loop (1+ i) (div (* x (- n i)) (1+ i)))))))
(define-method frequencies ((xs <collection>))
(let1 d (make-dict)
(for-each (^x (d'update! x 1+ 0)) xs)
d))
;; '(a b c) -> op(op(op(init, a), b), c)
(define (scanl op init xs)
(define (f a b)
(let1 t (op b a)
(values t t)))
(map-accum f init xs))
;; '(a b c) -> op(a, op(b, op(c, init)))
(define (scanr op init xs)
(define (f a b)
(let1 t (op a b)
(values t t)))
(reverse (map-accum f init (reverse xs))))
(define (map-accuml op init xs)
(values-ref (map-accum (^(a b) (op b a)) init xs)
0))
(define min* (apply$ min))
(define-method min* ((v <vector>))
(assume (> (len v) 0))
(fold min (vector-ref v 0) v))
(define max* (apply$ max))
(define-method max* ((v <vector>))
(assume (> (len v) 0))
(fold max (vector-ref v 0) v))
(define minmax* (apply$ minmax))
(define zip* (apply$ zip))
(define string* (apply$ string))
(define mlet match-let)
(define mlet* match-let*)
(define mlet1 match-let1)
(define (==$ x)
(pa$ == x))
(define-macro (input! . vars)
(define (group xs)
(if (null? xs)
'()
(let1 x (car xs)
(cond
((keyword? x) ; (:i VAR)
(assume (and (pair? (cdr xs))
(symbol? (cadr xs))))
(cons (list x (cadr xs)) (group (cddr xs))))
((symbol? x) ; default :i
(cons (list :i x) (group (cdr xs))))
((pair? x)
(cons (group x) (group (cdr xs))))
(else
(error "parse error: " xs))))))
(define (gen-define-values binds)
(let* ((ss (gensym))
(vars (map cadr binds))
(vals (map-with-index
(^(i x)
(ecase x
((:i) `(int (list-ref ,ss ,i)))
((:i-1) `(- (int (list-ref ,ss ,i)) 1))
((:s) `(list-ref ,ss ,i))))
(map car binds))))
`(define-values ,vars (let1 ,ss (read-words)
(values ,@vals)))))
(define (gen-define-values-1 kind var)
(let* ((val (ecase kind
((:i) `(map int (read-words)))
((:i-1) `(map (^x (- (int x) 1)) (read-words)))
((:s) `(read-words)))))
`(define-values (,var) (values ,val))))
(define (gen bind)
(match bind
((':i var) `(define ,var (int (input))))
((':i-1 var) `(define ,var (- (int (input)) 1)))
((':s var) `(define ,var (input)))
(else
(match-let1 (x . more) bind
(if (null? more)
(gen-define-values-1 (car x) (cadr x))
(gen-define-values bind))))))
(let ((binds (group vars)))
`(begin
,@(map gen binds))))
(define-macro (! fn . args-with-placeholders)
(define (replace-placeholder params args)
(let ((params params)
(args args))
(if (null? args)
'()
(let1 x (car args)
(cond ((eq? '_ x)
(cons (car params)
(replace-placeholder (cdr params)
(cdr args))))
(else
(cons x
(replace-placeholder params
(cdr args)))))))))
(let* ((num-placeholders (count (pa$ eq? '_) args-with-placeholders))
(params (rep num-placeholders gensym)))
`(lambda ,params (,fn ,@(replace-placeholder
params
args-with-placeholders)))))
(define-macro (d/ . args)
(let ((ss (map (^x
`(format #f "~a=~:w" (quote ,x) ,x))
args)))
`(print (string-join (list ,@ss) " "))))
(define-macro (mfn pat . body)
(let ((args (gensym)))
`(lambda ,args
(mlet1 ,pat ,args
,@body))))
(define-macro (mfn1 pat . body)
(let ((arg (gensym)))
`(lambda (,arg)
(mlet1 ,pat ,arg
,@body))))
(define (digits n)
(map digit->integer (str n)))
(define (digits->int ds)
(fold-left (^(a b) (+ (* 10 a) b)) 0 ds))
(define (rep n thunk)
(list-ec (: _ n)
(thunk)))
(define (memoize fn)
(let1 cache (make-hash-table 'equal?)
(lambda args
(if (hash-table-exists? cache args)
(hash-table-get cache args)
(rlet1 val (apply fn args)
(hash-table-put! cache args val))))))
(define (accumulate xs)
(list->vector (scanl + 0 xs)))
(define (accum xs)
(let ((vs (accumulate xs)))
(case-lambda
((l r) ; [l, r]
(- (~ vs r) (if (> l 0) (~ vs (1- l)) 0)))
((r) ; [0, r]
(~ vs r)))))
(define (interval/cc lo hi)
(lrange lo (+ hi 1)))
(define (uniq xs)
(let1 used (make-hash-table 'equal?)
(let loop ((xs xs))
(if (null? xs)
'()
(mlet1 (x . more) xs
(if (hash-table-contains? used x)
(loop more)
(begin
(hash-table-put! used x #t)
(cons x (loop more)))))))))
(define (make-dict)
(let1 ht (make-hash-table equal-comparator)
(match-lambda*
(('get key)
(hash-table-get ht key))
(('get key default)
(hash-table-get ht key default))
(('put! key val)
(hash-table-put! ht key val))
(('update! key proc default)
(hash-table-update! ht key proc default))
(('push! key val)
(hash-table-push! ht key val))
(('contains? key)
(hash-table-contains? ht key))
(('keys)
(hash-table-keys ht))
(('values)
(hash-table-values ht))
(('items)
(hash-table->alist ht))
(('size)
(hash-table-num-entries ht))
(('map proc)
(hash-table-map ht proc)))))
(define (tap/d . args)
(pprint args)
(apply values args))
(define (make-set)
(let1 self (make-hash-table equal-comparator)
(match-lambda*
(('size)
(hash-table-num-entries self))
(('contains? val)
(hash-table-contains? self val))
(('add! val)
(hash-table-put! self val #t))
(('list)
(hash-table-keys self)))))
(def P (+ (pow 10 9) 7))
(define (inv x)
(pow x (- P 2) P))
(input! N)
(def inv2 (inv 2))
;; (2N)!/2^N
(def end (* 2 N))
(let1 ans 1
(do ((i 1 (1+ i)))
((> i end))
(set! ans (mod (* ans i) P)))
(dotimes (N)
(set! ans (mod (* ans inv2) P)))
(prn ans))
norioc