結果
| 問題 |
No.171 スワップ文字列(Med)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-05-19 02:26:46 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,428 bytes |
| コンパイル時間 | 160 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 10,752 KB |
| 最終ジャッジ日時 | 2024-07-06 05:32:36 |
| 合計ジャッジ時間 | 1,168 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 10 |
ソースコード
import collections
def nCb_mod_p(n, b, mod):
''' nCb % mod を返す。 mod が素数のときのみ有効。
'''
if b > n - b:
b = n - b
num = 1
mod_counter = 0
for k in range(n, n-b, -1):
if k % mod:
num *= k
else:
mod_counter += 1
num *= (k // mod)
num %= mod
den = 1
for k in range(1, b+1):
if k % mod:
den *= k
else:
mod_counter -= 1
den *= (k // mod)
den %= mod
if mod_counter > 0:
return 0
r = inv(den, mod)
return (num * r) % mod
def inv(a, m):
''' a * b = 1 (mod m) となる b を返す。 m は素数とする。
b = a**(m-2) (mod m) を使って計算。
'''
n = m - 2
b = bin(n)[2:][-1::-1]
ret = 1
tmp = a
if b[0] == '1':
ret = a
for bi in b[1:]:
tmp *= tmp
tmp %= m
if bi == '1':
ret *= tmp
ret %= m
return ret
def solve():
S = input().rstrip()
dic = collections.Counter(S)
n = len(S)
# 573 = 3 * 191
r3 = 1
r191 = 1
for b in dic.values():
r3 *= nCb_mod_p(n, b, 3)
r3 %= 3
r191 *= nCb_mod_p(n, b, 191)
r191 %= 191
n -= b
for r in range(r191, 573, 191):
if r % 3 == r3:
return (r - 1) % 573, dic
if __name__ == '__main__':
print(solve())