結果

問題 No.990 N×Mマス計算(Kの倍数)
ユーザー yakamotoyakamoto
提出日時 2020-02-14 23:03:08
言語 Kotlin
(1.9.23)
結果
TLE  
実行時間 -
コード長 3,973 bytes
コンパイル時間 17,939 ms
コンパイル使用メモリ 459,396 KB
実行使用メモリ 185,176 KB
最終ジャッジ日時 2024-11-16 01:22:45
合計ジャッジ時間 36,806 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 287 ms
57,544 KB
testcase_01 AC 290 ms
92,244 KB
testcase_02 AC 323 ms
61,164 KB
testcase_03 AC 289 ms
148,800 KB
testcase_04 AC 298 ms
57,444 KB
testcase_05 AC 289 ms
92,264 KB
testcase_06 AC 298 ms
61,396 KB
testcase_07 AC 308 ms
60,984 KB
testcase_08 AC 288 ms
57,760 KB
testcase_09 AC 291 ms
91,892 KB
testcase_10 AC 547 ms
76,556 KB
testcase_11 AC 1,084 ms
88,544 KB
testcase_12 TLE -
testcase_13 AC 1,002 ms
88,896 KB
testcase_14 AC 606 ms
76,084 KB
testcase_15 AC 540 ms
67,592 KB
testcase_16 AC 587 ms
73,884 KB
testcase_17 AC 520 ms
63,360 KB
testcase_18 TLE -
testcase_19 TLE -
testcase_20 AC 705 ms
185,176 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.io.BufferedReader
import java.io.InputStream
import java.io.InputStreamReader
import java.util.*
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min

val MOD = 1_000_000_007

typealias Fac = MutableMap<Int, Int>

class Solver(stream: InputStream, private val out: java.io.PrintWriter) {

  fun solve() {
    val N = ni()
    val M = ni()
    val K = ni()
    val op = next()
    val B = na(M)
    val A = na(N)

    if (op == "+") {
      val C = mutableMapOf<Int, Int>()
      for (i in 0 until M) {
        val m = B[i] % K
        C.merge(m, 1, Int::plus)
      }

      var ans = 0L
      for (i in 0 until N) {
        val mm = A[i] % K
        val m = (K - mm) % K
        ans += C.getOrDefault(m, 0)
      }
      out.println(ans)
    } else {
      val fk = factorzie(K)
      val C = mutableMapOf<Fac, Int>()
      for (i in 0 until M) {
        val fb = factorzie(B[i])
        C.merge(filter(fb, fk), 1, Int::plus)
      }

      var ans = 0L
      for (i in 0 until N) {
        val fa = factorzie(A[i])
        val needed = needs(fa, fk)
        C.forEach {
          if (isSatisfy(it.key, needed)) {
            ans += it.value
          }
        }
      }
      out.println(ans)
    }
  }

  fun factorzie(a: Int): Fac {
    val res = mutableMapOf<Int, Int>()
    var x = a
    loop@while(x > 1) {
      var i = 2
      while(i * i <= x) {
        if (x % i == 0) {
          res.merge(i, 1, Int::plus)
          x /= i
          continue@loop
        }
        i++
      }
      res.merge(x, 1, Int::plus)
      x = 0
    }
    return res
  }

  fun filter(x: Fac, filter: Fac): Fac {
    val res: Fac = mutableMapOf()
    x.forEach {
      if (filter.containsKey(it.key)) {
        res[it.key] = min(filter[it.key]!!, it.value)
      }
    }
    return res
  }

  fun needs(x: Fac, target: Fac): Fac {
    val res: Fac = mutableMapOf()
    target.forEach {
      if (!x.containsKey(it.key)) {
        res[it.key] = it.value
      } else {
        val needed = max(0, it.value - x[it.key]!!)
        if (needed > 0) res[it.key] = needed
      }
    }
    return res
  }

  fun isSatisfy(a: Fac, needed: Fac): Boolean {
    var ok = true
    needed.forEach {
      ok = ok and (it.value <= a.getOrDefault(it.key, 0))
    }
    return ok
  }










































  private val isDebug = try {
    // なんか本番でエラーでる
    System.getenv("MY_DEBUG") != null
  } catch (t: Throwable) {
    false
  }

  private var tokenizer: StringTokenizer? = null
  private val reader = BufferedReader(InputStreamReader(stream), 32768)
  private fun next(): String {
    while (tokenizer == null || !tokenizer!!.hasMoreTokens()) {
      tokenizer = StringTokenizer(reader.readLine())
    }
    return tokenizer!!.nextToken()
  }

  private fun ni() = next().toInt()
  private fun nl() = next().toLong()
  private fun ns() = next()
  private fun na(n: Int, offset: Int = 0): IntArray {
    return map(n, offset) { ni() }
  }

  private inline fun map(n: Int, offset: Int = 0, f: (Int) -> Int): IntArray {
    val res = IntArray(n)
    for (i in 0 until n) {
      res[i] = f(i + offset)
    }
    return res
  }

  private inline fun debug(msg: () -> String) {
    if (isDebug) System.err.println(msg())
  }

  private fun debug(a: LongArray) {
    debug { a.joinToString(" ") }
  }

  private fun debug(a: IntArray) {
    debug { a.joinToString(" ") }
  }

  private fun debug(a: BooleanArray) {
    debug { a.map { if (it) 1 else 0 }.joinToString("") }
  }

  private fun debugDim(A: Array<IntArray>) {
    if (isDebug) {
      for (a in A) {
        debug(a)
      }
    }
  }

  /**
   * 勝手にimport消されるのを防ぎたい
   */
  private fun hoge() {
    min(1, 2)
    max(1, 2)
    abs(-10)
  }
}

fun <A, B> pair(a: A, b: B) = RPair(a, b)
data class RPair<A, B>(val _1: A, val _2: B)

fun main() {
  val out = java.io.PrintWriter(System.out)
  Solver(System.`in`, out).solve()
  out.flush()
}
0