結果
問題 | No.1331 Moving Penguin |
ユーザー |
![]() |
提出日時 | 2021-01-09 16:16:20 |
言語 | Crystal (1.14.0) |
結果 |
AC
|
実行時間 | 359 ms / 1,500 ms |
コード長 | 1,795 bytes |
コンパイル時間 | 13,614 ms |
コンパイル使用メモリ | 295,464 KB |
実行使用メモリ | 10,796 KB |
最終ジャッジ日時 | 2024-11-07 15:05:31 |
合計ジャッジ時間 | 26,594 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 49 |
ソースコード
lib Cfun strtoll(s : UInt8*, p : UInt8**, b : Int32) : Int64endclass Stringdef to_i64C.strtoll(self, nil, 10)endendstruct Mint@@MOD = 1_000_000_007i64def self.mod@@MODenddef self.zeroMint.new(0)enddef initialize(n)@n = n.to_i64 % @@MODendgetter n : Int64def + : selfselfenddef - : selfMint.new(n != 0 ? @@MOD - @n : 0)enddef +(m)Mint.new(@n + m.to_i64 % @@MOD)enddef -(m)Mint.new(@n - m.to_i64 % @@MOD)enddef *(m)Mint.new(@n * m.to_i64 % @@MOD)enddef /(m)raise DivisionByZeroError.new if m == 0a, b, u, v = m.to_i64, @@MOD, 1i64, 0i64while b != 0t = a // ba -= t * ba, b = b, au -= t * vu, v = v, uendMint.new(@n * u)enddef //(m)self / menddef **(m : Int)t, res = self, Mint.new(1)while m > 0res *= t if m.odd?t *= tm >>= 1endresenddef ==(m)@n == m.to_i64enddef !=(m)@n != m.to_i64enddef succself + 1enddef predself - 1enddef to_i64 : Int64@nenddelegate to_s, to: @ndelegate inspect, to: @nendstruct Intdef to_mint : MintMint.new(self)endendclass Stringdef to_mint : MintMint.new(self)endendn = read_line.to_ia = read_line.split.map(&.to_i)sqrt_n = Math.sqrt(n).to_iplus = Array.new(sqrt_n) { |i| [Mint.zero] * i }dp = [Mint.zero] * ndp[0] = Mint.new(1)(0...n).each do |i|(1...sqrt_n).each do |x|dp[i] += plus[x][i % x]endif a[i] < sqrt_nplus[a[i]][i % a[i]] += dp[i]else(i + a[i]...n).step(a[i]) { |j|dp[j] += dp[i]}endif i + 1 < n && a[i] > 1dp[i + 1] += dp[i]endendputs dp[n - 1]