問題一覧 > 教育的問題

No.8015 アンチローリングハッシュ

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 256 MB / スペシャルジャッジ問題 (複数の解が存在する可能性があります)
タグ : / 解いたユーザー数 36
作問者 : koyumeishi
3 ProblemId : 652 / 自分の提出
問題文最終更新日: 2015-11-14 17:49:35

問題文

太郎君は先日、文字列のハッシュ値を得る次のような関数を実装しました。
(参考:ラビン-カープ文字列検索アルゴリズム)

長さ n の文字列 S のハッシュ値は次の式で計算される。

Hash(S)=i=0n1 (Si × an1i )(modb)

ここで、Si は文字列の i 番目の文字のASCIIコード番号を指す。 例えば S="abcz"ならば、S0=97S1=98S2=99S3=122 である。


しかし、太郎君は見様見真似で実装したため、 ab にどのような数を選んだらいいのかよく分かっていません。 そこで太郎君はとりあえず、 ab1 以上 105 以下の整数の中からランダムに選ぶ事にしたようです。

太郎君が選んだ a, b が入力に与えられるので、 ハッシュ値が等しくなるような2つの文字列S, Tを出力してください。
ただしSTは小文字のアルファベット'a'-'z'で構成される異なる文字列で、その長さは等しく、かつ106以下でなければなりません。

ジャッジに使われるハッシュ関数の実装(C++)は次の通りです。

unsigned long long get_hash(string s, unsigned long long a, unsigned long long b){
	unsigned long long hash = 0;

	for(int i = 0; i < s.size(); i++){
		hash = (hash * a + s[i]) % b;
	}

	return hash;
}

入力

a b

ab が空白区切りで与えられます。
1a105
1b105

出力

S
T

1行目にS、2行目にTを出力してください。
STは以下の制約を満たす必要があります。
Hash(S)=Hash(T)
1|S|=|T|106
ST
STは小文字のアルファベット'a'-'z'のみで構成される

サンプル

サンプル1
入力
3 7
出力
ulwoorwpxrhrfcckazth
ulwoarwpxrhrfcckazth

S,Tの一例です。
どちらもハッシュ値が4になります。

サンプル2
入力
7 9
出力
talybdsmdphtmvhutkxb
talybdsmdphtgvtutkxn

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。