読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

No.170 スワップ文字列(Easy)

回答

#45073 No.170 スワップ文字列(Easy) - yukicoder

結果から言えば,解説通りの解き方をした.
出現数が多い文字列から組みあわせを掛けあわせる.
ちなみに,No.171も基本的にはこれで溶ける.

No.170くらいであれば,組み合わせの数が少ないため,itertoolsでコンビネーション求めて,その長さを出す方法でもOK(No.171でやったら余裕でTLEした)

from math import factorial

S = input()
dic = dict()
for c in S:
    if c not in dic:
        dic.update({c:1})
    else:
        dic[c] += 1

length = len(S)
res = 1
vs = [i for i in dic.values()]
vs.sort()
vs = vs[::-1]

for i in vs:
    res *= factorial(length) // (factorial(length - i) * factorial(i))
    length -= i
print((res-1))


No.171 スワップ文字列(Med)

from math import factorial

S = input()
dic = dict()
for c in S:
    if c not in dic:
        dic.update({c:1})
    else:
        dic[c] += 1

length = len(S)
res = 1
vs = [i for i in dic.values()]
vs.sort()
vs = vs[::-1]

for i in vs:
    res *= factorial(length) // (factorial(length - i) * factorial(i))
    length -= i
print((res-1) % 573)

偶然にもこれで初めての★3AC.