ABC 103 C - Modulo Summationのメモ
解いてみました。
考察
なので、可能な限り多くの
ここまで考えたら、あることに気づきました。可能な限り多くのというか、全ての
そういうことであれば、
最初に書いた通り
実装
そんなんでいいのかと少し心配しましたが、これで通りました。実際に
fun main() {
val n = readLine()!!.toInt()
val a = readLine()!!.split(" ").map { it.toLong() }
println(a.map { it - 1 }.sum())
}
と言いつつ、実はその前に実際に
単純に全部かけ合わせるのではなく、最小公倍数を求めていけばオーバーフローしないかなと雑に考えたのですが、そんなことはなく…
import java.math.BigInteger
fun main() {
val n = readLine()!!.toInt()
val a = readLine()!!.split(" ").map { it.toBigInteger() }
val m = a.reduce { left, right ->
lcm(left, right)
} - BigInteger.ONE
val list = a.map { m % it }
var ans = BigInteger.ZERO
for(i in list.indices) {
ans += list[i]
}
println(ans)
}
fun gcd(a: BigInteger, b: BigInteger): BigInteger {
return if (b == BigInteger.ZERO) {
a
} else {
gcd(b, a % b)
}
}
fun lcm(a: BigInteger, b: BigInteger): BigInteger {
val d = gcd(a, b)
return a / d * b;
}
どうせ多倍長整数を使ってしまうなら、上に書いた通り単純に全部かけ合わせるのでもいいのではと思ってやってみたのがこちら。
import java.math.BigInteger
fun main() {
val n = readLine()!!.toInt()
val a = readLine()!!.split(" ").map { it.toBigInteger() }
val m = a.reduce { left, right ->
left * right
} - BigInteger.ONE
val list = a.map { m % it }
var ans = BigInteger.ZERO
for(i in list.indices) {
ans += list[i]
}
println(ans)
}
これでも普通に通りました。
(執筆時間: 26分25秒)
Discussion