PythonでJOI難易度6を埋める #21

anagram - アナグラム (Anagram)

計算自体は数学でも見る問題だが,実装が破滅したので,こちらを参考に

from collections import Counter
from math import factorial
from sys import stdin
input = stdin.readline

s = list(input().strip())

def comb(x):
    cal = factorial(len(x))
    for i in Counter(x).values():
        cal //= factorial(i) #同じ文字が複数個,存在するならその数の階乗で割る

    return cal

ans = 0
for i, j in enumerate(s):
    used = set()
    for k, l in enumerate(s[i:], start = i):
        if (l < j) and (l not in used):
            ans += comb(s[i: k] + s[k + 1:]) #k番目を除いた順列
            used.add(l)

print(ans + 1) #自分よりも前にans個あるので+1