ABC475 D - Alphametic Prime
文字素数
考え方
いわゆる覆面算のようにして、素数にできるかという問題。
$S$ が $7$ 文字以下なので、対応する素数として出てくるものは、$10000000$ 未満のもののみ。
$S$ の文字数がもっと短ければ、上限はもっと小さくなる。
ということで、エラトステネスの篩で、$10^{|S|}$ 未満の素数を全て列挙すればよい。
$|S|$ 桁の素数を全て文字化し、「同じ文字がどの位置にあるか」を判定する関数にかける。
与えられた文字列と同じ結果になったものがあれば、それを答えればよい。
計算量は素数列挙部分が支配的で $O(10^{|S|}\log |S|)$ である。
入力例1での動作
入力を受け取る。
s: "motor"
motor では、o が $2$ 文字目と $4$ 文字目に現れる。
それ以外の m, t, r はそれぞれ $1$ 回ずつ現れ、互いに異なる文字である。
まず、エラトステネスの篩で $100000$ 未満の素数を列挙する。
そのうち $5$ 桁の素数を順に文字列へ変換し、同じ文字が現れる位置を motor と比較していく。
例えば 10007 では、0 が $2$ 文字目から $4$ 文字目までの $3$ か所に現れるので、motor とは一致しない。
その後の素数についても同様に調べていく。
10607 では、0 が $2$ 文字目と $4$ 文字目に現れる。
それ以外の 1, 6, 7 はそれぞれ $1$ 回ずつ現れ、互いに異なる数字である。
したがって、同じ文字が現れる位置が motor と一致する。
よって、10607 を答えとして出力する。
注意点
特になし。
別解
特になし。