遙かなるマチョジニア

マッチョXエンジニアを目指すブログ

【AtCoder反省】AtCoder Beginner Contest 166

スポンサードリンク

atcoder.jp

Dの問題が意外とあっけなくとけた。

解説より f:id:shuheilocale:20200504103321p:plain

範囲については真面目に考えなかった。とりあえずえいやでいいや。みたいな。 あとは、大体考え方は同じ。

X = int(input())

a = [int( i/2)*((-1)**i) for i in range(1, 1000)]
b = [int( i/2)*((-1)**i) for i in range(1, 1000)]

"""
1 Aが正ならBは負または、Aより小さい正
2 Aが負ならBは負
3 X/(a+b)は、1以上の整数
"""

find = False
if X == 0:
  print(0)
else:  
  for a_ in a:
    for b_ in b:

      if a_ + b_ == 0:
        continue
      if a_ >= 0:
        if b_ >= 0 and b_ > a_:
          continue
      if a_ < 0:
        if b_ >= 0:
          continue
      """
      if X%(a_+b_) != 0:
        print("hoge")
        continue
      """
      if (a_**5) - (b_**5) == X:
        print(f"{a_} {b_}")
        find = True
        break
    if find:
      break

3 X/(a+b)は、1以上の整数

については、n乗同士の差の展開式で (a+b)(a4−a3b+a2b2−ab3+b4) = X となって、 (a4−a3b+a2b2−ab3+b4) = X/(a+b)

となるから左辺が整数だから右辺も整数になると思って制限設けたけどうまくいかなかったので外した。

自分はinputが何行にもわたるものが嫌いだ。だって面倒だから。 今回はBもCもそんな感じだった。けどそれで食わず嫌いしてると点数が稼げないんだろうから そこをちゃんとテンプレート化して楽になるようにしないといけないなと思いました。 環境も今はgoogle colabでやってるが、 ちゃんとした物を作りたい。けどめんどうなのでとりあえずほったらかし。