競プロ弱者の解答

競プロ弱者の成長記録

ABC152:水色競プロerのムーブ備忘録(やけくそ解法でEを通す)

〇コンテスト名:ABC152

〇配点          A:100 B:200 C:300 D:400 E:500 F:600

〇制限時間  100分

 いつも通りのABC

〇コンテスト開始時のsyunsukeのレート 1339

〇今回の方針 
 いつも通り、前から順番に解く。
 Cまではテストケースも程々に速度重視で。
 Dが難しく、Cまでのペナで死にたくないので。
 はまったら順位表をチェック。
 ・今見てる問題を飛ばす?
 ・何か簡単な解法がある?
 の判断材料に

コンテスト開始!

A:NとMが与えられる。N=MならYes、違えばNoを出力。
 昨日のARC級とは違いますね。
 これがABC級のA問題でしょう。

N,M=map(int,input().split())
if N==M:
    print("Yes")
else:
    print("No")

 1:09 AC

B:aとbが与えられて、aをb個並べたものとbをa個並べたものの内、辞書順で早い方を出力
 aとbを数字でなく、文字列として受け取っておいて("a","b")、"a"をb個並べたものと"b"をa個並べたものを実際に作ってリストに入れて、ソートして前にきているものを出力。
 型変換の理解を問う、地味だけど良い問題ですね。

a,b=list(input().split())
X=a*int(b)
Y=b*int(a)
List=[X,Y]
List.sort()
print(List[0])

 4:11 AC ちょっともたついた?どんどんいきましょう。

C:N個の整数が並んでいる。左から順に見ていき、見ている数字が今までの最小値以下なら答えを1増やして最小値を更新する。
 最小値の初期値は2x10**5より大きい数値を入れておけば良いですね。

N=int(input())
P=list(map(int,input().split()))
MIN=10**9
ans=0
for i in range(N):
    if P[i]<=MIN:
        ans+=1
        MIN=P[i]
print(ans)

 6:48 AC 急げ急げ!

D:N以下の数値A,Bがあって、Aの先頭の数字とBの最後の数字が一緒、Bの先頭の数字とAの最後の数字が一緒。そんな組み合わせはいくつあるか?
 考察の1手目が思いつきません。
 一旦パスしてEを見に行きましょう。
 Eはmodの割り算。逆元使うやつ?それは無理。
 やっぱりこれを解きましょう。

 とりあえずNは2x10**5以下なので、全数探索できる?
 たとえば1と1〇〇〇1は条件を満たす。で、この〇の中は何でもOK。
 いやそんな問題解けない。
 !!
 降りてきた!
 例えば、数字がA〇〇Bなら、B*Aとなら条件を満たす。
 これを辞書に入れておいて・・説明は難しいのでコードをどうぞ

N=int(input())

D={}
for i in range(1,N+1):
    I=str(i)
    if (I[-1],I[0]) not in D:
        D[(I[-1],I[0])]=1
    else:
        D[(I[-1],I[0])]+=1

ans=0
for j in range(1,N+1):
    J=str(j)
    if (J[0],J[-1]) in D:
        ans+=D[(J[0],J[-1])]
print(ans)

よく閃きました。
 19:13 AC なんと300番台!

E:N個の整数Aiが与えられる。それらの最小公倍数を求め、最小公倍数をBiで割った値の合計を求めよ。
 はいmodの割り算できません。
 ただ、時間はたっぷりあるので、ググりましょう。けんちょん先生の記事がすぐにヒットしますね。
 でも、私はPythonしか使えないので、Pythonでコードを書いている記事を探しましょう。
 ・・
 ペタッと貼っておわりなものがあれば良いのですが、見つかりませんね。
 さすがに記事を読んですぐに理解してコードに起こす。なんてことはできませんし、困りました。
 ・・
 順位表確認。
 あれ?結構多くの人が解いてる?
 何か見落としてる?
 逆元いらない?
 とりあえず、Pythonは巨大な数字も扱えるんです。
 ダメ元で下のコードをぶん投げてみましょう。

n=int(input())
A=list(map(int,input().split()))
mod=10**9+7
def lcm(X,Y):
    x=X
    y=Y
    if y>x:
        x,y=y,x
    while x%y!=0:
        x,y=y,x%y
    return X*Y//y

cnt=0
ans=0
LCM=1
for i in range(n):
    Q=lcm(LCM,A[i])
    cnt*=Q//LCM
    LCM=Q
    cnt+=Q//A[i]
print(cnt%mod)

 あれ?通ってしまった・・
 78:37 AC いやこれダメでしょ? こんなの投げちゃだめ? もっと早くに投げとけば良かった?

F:無理

結局 78:37 A,B,C,D,E 5完0ペナ
パフォ1594,レート+28で1367(Highest更新)になりました。
Highest更新はうれしいのですが、このEの解法はダメでしょう。