結果
| 問題 | No.2 素因数ゲーム |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-09-04 09:47:15 |
| 言語 | Crystal (1.14.0) |
| 結果 |
AC
|
| 実行時間 | 4 ms / 5,000 ms |
| コード長 | 1,379 bytes |
| コンパイル時間 | 12,664 ms |
| コンパイル使用メモリ | 318,064 KB |
| 実行使用メモリ | 7,716 KB |
| 最終ジャッジ日時 | 2025-09-04 09:47:30 |
| 合計ジャッジ時間 | 14,075 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 31 |
ソースコード
require "big"
primes = [] of BigInt
memo = [Hash(BigInt, Bool).new, Hash(BigInt, Bool).new]
def find_prime_factors(n : BigInt, primes : Array(BigInt))
temp = n
i = BigInt.new(2)
while i * i <= temp
if temp % i == 0
primes << i
while temp % i == 0
temp //= i
end
end
i += 1
end
primes << temp if temp > 1
end
def can_win(turn : Int32, num : BigInt, primes : Array(BigInt), memo : Array(Hash(BigInt, Bool))) : Bool
if memo[turn].has_key?(num)
return memo[turn][num]
end
if num == 1
return turn == 1
end
if turn == 0
primes.each do |p|
if num % p != 0
next
end
next_num = num
while next_num % p == 0
next_num //= p
if can_win(1, next_num, primes, memo)
memo[turn][num] = true
return true
end
end
end
memo[turn][num] = false
return false
else
primes.each do |p|
if num % p != 0
next
end
next_num = num
while next_num % p == 0
next_num //= p
if !can_win(0, next_num, primes, memo)
memo[turn][num] = false
return false
end
end
end
memo[turn][num] = true
return true
end
end
n = BigInt.new(gets.not_nil!.chomp.to_s)
find_prime_factors(n, primes)
puts can_win(0, n, primes, memo) ? "Alice" : "Bob"
vjudge1