結果

問題 No.990 N×Mマス計算(Kの倍数)
ユーザー yakamotoyakamoto
提出日時 2020-02-14 23:37:15
言語 Kotlin
(1.9.23)
結果
TLE  
実行時間 -
コード長 4,352 bytes
コンパイル時間 19,771 ms
コンパイル使用メモリ 470,472 KB
実行使用メモリ 184,872 KB
最終ジャッジ日時 2024-11-16 01:46:09
合計ジャッジ時間 37,249 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 304 ms
57,872 KB
testcase_01 AC 326 ms
95,128 KB
testcase_02 AC 332 ms
63,840 KB
testcase_03 AC 306 ms
146,272 KB
testcase_04 AC 331 ms
60,344 KB
testcase_05 AC 308 ms
92,536 KB
testcase_06 AC 330 ms
63,764 KB
testcase_07 AC 335 ms
57,140 KB
testcase_08 AC 311 ms
54,448 KB
testcase_09 AC 307 ms
54,272 KB
testcase_10 AC 580 ms
70,076 KB
testcase_11 AC 676 ms
82,972 KB
testcase_12 TLE -
testcase_13 AC 639 ms
85,644 KB
testcase_14 AC 627 ms
76,584 KB
testcase_15 AC 572 ms
68,396 KB
testcase_16 AC 623 ms
73,924 KB
testcase_17 AC 545 ms
63,524 KB
testcase_18 TLE -
testcase_19 AC 1,699 ms
89,572 KB
testcase_20 AC 749 ms
184,872 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 = List<Pair<Int, Int>>
typealias Cnt = MutableList<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 = factorize(K).toList()
      val fkCnt = fk.map{it.second}.toMutableList()
      debug{fk.toString()}
      debug{fkCnt.toString()}
      val C = mutableMapOf<Cnt, Int>()
      for (i in 0 until M) {
        val fb = factorize(B[i], fk)
        C.merge(filter(fb, fkCnt), 1, Int::plus)
      }
      debug{C.toString()}

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

  fun factorize(a: Int, base: Fac): Cnt {
    var x = a
    val res = mutableListOf<Int>()
    for (e in base) {
      var cnt = 0
      for (j in 0 until e.second) {
        if (x % e.first != 0) break
        x /= e.first
        cnt++
      }
      res += cnt
    }
    return res
  }

  fun factorize(a: Int): MutableMap<Int, Int> {
    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: Cnt, filter: Cnt): Cnt {
    val res: Cnt = mutableListOf()
    for (i in 0 until x.size) {
      res.add(min(filter[i], x[i]))
    }
    return res
  }

  fun needs(x: Cnt, target: Cnt): MutableList<Int> {
    val res: Cnt = mutableListOf()
    for (i in 0 until x.size) {
      res.add(max(0, target[i] - x[i]))
    }
    return res
  }

  fun isSatisfy(x: Cnt, needed: Cnt): Boolean {
    var ok = true
    for (i in 0 until x.size) {
      ok = ok and (needed[i] <= x[i])
    }
    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