KKkbt
@KKkbt (Kenta Kubota)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

AtCoderのA問題について

本日2020/10/31のatcoderのA問題について質問です。

A, B, C = map(int, input().split())


ans = (A * (A + 1) * B * (B + 1) *  C * (C + 1) / 8) % 998244353

print(int(ans))

ただ他の人の解答を見ると

# ans= A * (A + 1) // 2 * B * (B+1) // 2 * C * (C + 1) //2 % 998244353

としているだけでほとんど僕の解答と変わらないにもかかわらず正解でした。
なぜ僕のが間違っているかが分かりません、、、
物凄く単純なミスな気がするのですが、どなたか教えていただけませんか?

1

1Answer

設問を理解せずに回答することをお許しください。

実数の除算(/)と整数除算(//)では、結果が異なるためだと思います。
整数除算は、割り切れない部分が切り捨てられます。

コード
A = 1000000000
B = 987654321
C = 123456789
print ((A * (A + 1) * B * (B + 1) *  C * (C + 1) / 8) % 998244353)
print ((A * (A + 1) * B * (B + 1) *  C * (C + 1) // 8) % 998244353)
print (A * (A + 1) // 2 * B * (B + 1) // 2 * C * (C + 1) // 2 % 998244353)
結果
991055960.0
951633476
951633476
0Like

Comments

  1. @KKkbt

    Questioner

    回答ありがとうございます!

    実数の除算(/)と整数除算(//)が違うのは分かるのですが、なぜ結果が異なるのかが分かりません。
    今回の場合だと実数の除算(/)でも割り切れると思うので、整数除算(//)と違いはないのではないかと予想したのですが、、
  2. @KKkbt

    Questioner

    すみません!解決しました!ありがとうございました!
  3. 実数と整数の計算精度の違いですね。
    実数だと浮動小数点数になってしまいますが、整数の場合は(Python3だと)有効桁数に制限がないのですね。
    勉強になりました。

Your answer might help someone💌