ARC020の結果はこんな感じ
無事2年生になったらりょすです。
最近Python3の勉強を初めてなかなか前に進めません。誰か助けて。
さて。ちょっと前にあったAtcoderRegularContest#020のCの問題を解いた時の話をします。
ARC#020:http://arc020.contest.atcoder.jp/
まず言っておきます
私はPython初心者です。
Pythonistaの皆さんは変態なので,がちな方はいろいろ仰りたいことがあるかもしれませんがご容赦ください。お願いだから。
問題の要旨
整数A, Bが与えられるのでAをBで割ったあまりを表示せよ
N a1 L1 a2 L2 : aN LN B
Nは整数Aの情報の長さを示す。
整数Aはa1をL1回繰り返したものとa2をL2回繰り返したものa3を・・・aNをLN回繰り返したものをひっつけたもの
N+2行目で整数Bが示される
3 123 2 4 2 56 1 1000000007
これは
1231234456を100000007(10^9 + 7)で割ったものを示せばいいので
231234449
となる。
どう解く?
Pythonは 文字列*数値 で文字列をかけた数値分の回数を繰り返すことができる
つまり
print('SYSKEN' * 3)
と入力すれば
'SYSKENSYSKENSYSKEN'
と出力される。
それを使えば整数Aを出せます。
そこで(なぜか)こんなコードを書きました
N = int(input()) ax = [] #aNを格納するリストを作る for i in range(N): a, L = map(int, input().split()) a = str(a) #aをstring型に変換 ax.append(a*L) #axにaN(a*L)を格納 ay = "".join(ax[:N]) #ax内の要素を結合 ay = int(ay) #ayをint型に変換 B = int(input()) print(ay % B) #A(ay)をBで割ったあまりを出力
プログラミング初心者かっっっっ
aNをなぜリストに入れる必要があったのか,for文で回してる間に足していけばいいんじゃないか
(文字列の足し算で結合ができます ‘SYSKEN ‘ + ‘is mine’で’SYSKEN is mine’に)
周りくどいというか,なんか気持ち悪い・・・変数無駄に多いし。
ちなみに.joinでリスト内の要素を結合できます。 ax[:N]でax内の最初からN-1番目までの要素を指定できる・・
何かさすがにきもかったのでこんなかんじに書きなおしました
A = '' #Aは文字列ですよ〜〜 for i in range(int(input())): a, L = map(int, input().split()) a = str(a) A += a*L #AにaN(a*L)を足していく print(int(A)%int(input())) #Aをintに変換してB(入力された数値)で割る
だいぶましになりましたね
変数の数減ったし,行数減ったし無駄がだいぶなくなりました。
ただ,Atcoder。こんなに甘くない。
810143056 100000000 81671422 99999999 1639053 99999998 1657560 99999997 1000000007
あほかっっっっっ
こんなのはさすがにやばいので解けませんでした
Pythonで正解出してる方もいらっしゃいましたのでできないことはないですが,僕にはできません。
ってことで
この問題では100点中20点の部分点をもらいました。ばんざい
今後も精進してまいります
P.S.
しすけんらじおは5月からリニューアルして公開するよ!
(カテゴリーはへんなものでいいのかしら。)
コメントを残す