AtCoder Beginner Contest 090/AtCoder Regular Contest 091

はい。
https://atcoder.jp/contests/abc090

A - Diagonal String

Python3

ans=""
for i in range(3):
    s=input()
    ans+=s[i]
print(ans)

1つずつずらして繋いで出力。

B - Palindromic Numbers

Python3

n,k=map(int,input().split())
ans=chk=0
for i in range(n,k+1):
    t=str(i)
    ans+=t==t[::-1]
print(ans)

何か工夫必要なのか悩んだけど10000から99999までぶん回して大丈夫だった。

C - Flip,Flip, and Flip......

Python3

n,m=map(int,input().split())
print(1 if n==m==1 else max(n,m)-2 if min(n,m)==1 else (n-2)*(m-2))

n==m==1なら1マスだけ裏返りになる、n,mのどちらかだけ1なら両端が表で内側は裏になる(oo、oxo、oxxoみたいな感じ)、どちらも2以上なら(n-2) * (m-2)が裏になる。手元で実際にシミュしてみるとそうなるはず、多分。

D - Remainder Reminder

PyPy3

n,k=map(int,input().split())
if k==0:
    print(n*n)
    exit()
ans=0
for i in range(k+1,n+1):
    ans+=((n+1)//i)*(i-k)+max(0,((n+1)%i-k))
print(ans)

はい。どうにもうまく行かないので解説見たり、検索で他の人の記事を見たりでようやくACしました。当初はa>bの時とかa<bの時とか考えようとしてたんですがダメな方針でしたね。

f:id:clarinet758:20190620231705p:plain
abc090_d

a/bの結果を表に起こしてみるとそれはそうという感じでした。a<bの時は確かにa全部が余りになるのですが、a>bの時に余りがk以上になる部分だけを計算するのが大変面倒そうです。計算できませんでした。
ですがbを固定した数で考えると計算しやすい周期性があることがわかります。b=0の時は0除算出来ないので空欄、b=1の時は常に割り切れるので全て余り0、b=2の時は余り0,1の周期で繰り返しです。b=3なら余り0,1,2の周期で繰り返しです。なので周期の繰り返しの回数とk以上の部分を考えて計算すれば解けます。多分。周期性があることがすぐにわからなくても、図に起こして見て考えて周期性があることを気づけば良かったのになと思いました。
D問題については解説も図も http://arcslab.hatenablog.jp/entry/ARC091 に親切な記事があります。そちらを参照しましょう。