program wardrobe3;
Uses Strutils;
const MAX = 5000000;
type elenco = array[1..MAX] of string[1];
var m,k,i,w, calcolomod, psw:qword;
count : qword;
cod : longint;
cifre, stringadainvertire, stringainvertita, stringaordinata, Sconinv : Ansistring;
arrnum :array [1..MAX] of string[1];
modpsw :array [1..MAX] of Ansistring;
uscita:boolean;
procedure scambia (var x,y: string);
var t:string;
begin
t:=x;
x:=y;
y:=t;
end;
procedure scambiach (var x,y: char);
var t:char;
begin
t:=x;
x:=y;
y:=t;
end;
Procedure ordinamento (estremoi,estremos: qword; var v : elenco; ordinato:boolean);
var inf, sup, medio:qword;
pivot :string[1];
begin
inf:=estremoi;
sup:=estremos;
medio:= (estremoi+estremos) div 2;
pivot:=v[medio];
repeat
if (ordinato) then
begin
while (v[inf]<pivot) do inf:=inf+1;
while (v[sup]>pivot) do sup:=sup-1;
end;
if inf<=sup then
begin
scambia(v[inf],v[sup]);
inf:=inf+1;
sup:=sup-1;
end;
until inf>sup;
if (estremoi<sup) then ordinamento(estremoi,sup,v,ordinato);
if (inf<estremos) then ordinamento(inf,estremos,v,ordinato);
end;
Procedure inversione (x:Ansistring; inizio:qword; var Sconinv:ansistring);
var Sdainv,Sprefix : ansistring;
begin
Sdainv:='';Sprefix:='';
count:=m-inizio+1;
Sdainv:=copy(x,inizio, count);
Sprefix:=copy(x, 1, inizio-1);
stringainvertita:=ReverseString(Sdainv);
Sconinv:=Sprefix+stringainvertita;
end;
Procedure nextPermutation (var P : ansistring) ;
var pivot:qword;
(* Find the pivot index*)
begin
pivot := 0;
for i := m - 1 downto 1 do
if (P[i] < P[i + 1]) then begin pivot:=i; break; end;
(*If pivot point does not exist, exit dalla procedura perchè, essendo l'array ordinato, ho già trovato tutte le permutazioni*)
if pivot = 0 then begin uscita:=true; exit; end;
(* find the element from the right that is greater than pivot*)
for i := m downto pivot+1 do
if (P[i] > P[pivot]) then begin scambiach (P[i], P[pivot]); break; end;
(*Reverse the elements from pivot + 1 to the end to get the next permutation*)
if pivot+1=m then Sconinv:=P
else inversione (P, pivot+1, Sconinv);
end;
begin
(*assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);*)
readln(m,k);
readln(cifre);
for i:=1 to m do arrnum[i]:=copy(cifre,i,1); (*trasformo la stringa di input in un array per ordinarlo in modo crescente*)
ordinamento (1,m,arrnum, true);
stringaordinata:=''; Sconinv:='';
for i:=0 to k-1 do modpsw[i]:='';
for i:=1 to m do stringaordinata:=stringaordinata+arrnum[i]; (*ritorno da array a stringa per applicare le procedure*)
stringadainvertire:=stringaordinata;
uscita:=false; w:=1;
while stringadainvertire[w]='0' do w:=w+1;
scambiach(stringadainvertire[1], stringadainvertire[w]);
while (uscita=false) do
begin
val(stringadainvertire,psw,cod);
calcolomod:=psw mod k;
if modpsw[calcolomod]='' then modpsw[calcolomod]:=stringadainvertire
else begin writeln(stringadainvertire); writeln(modpsw[calcolomod]); uscita:=true; exit; end;
w:=w+1;
nextPermutation(stringadainvertire);
stringadainvertire:=Sconinv;
end;
writeln('-1');
end.
cHJvZ3JhbSB3YXJkcm9iZTM7ClVzZXMgU3RydXRpbHM7CmNvbnN0IE1BWCA9IDUwMDAwMDA7CnR5cGUgZWxlbmNvID0gYXJyYXlbMS4uTUFYXSBvZiBzdHJpbmdbMV07CnZhciBtLGssaSx3LCBjYWxjb2xvbW9kLCBwc3c6cXdvcmQ7CiAgICBjb3VudCA6IHF3b3JkOwogICAgY29kIDogbG9uZ2ludDsKICAgIGNpZnJlLCBzdHJpbmdhZGFpbnZlcnRpcmUsIHN0cmluZ2FpbnZlcnRpdGEsIHN0cmluZ2FvcmRpbmF0YSwgU2NvbmludiA6IEFuc2lzdHJpbmc7CiAgICBhcnJudW0gOmFycmF5IFsxLi5NQVhdIG9mICBzdHJpbmdbMV07CiAgICBtb2Rwc3cgOmFycmF5IFsxLi5NQVhdIG9mICBBbnNpc3RyaW5nOyAKICAgIHVzY2l0YTpib29sZWFuOwogICAgCnByb2NlZHVyZSBzY2FtYmlhICh2YXIgeCx5OiBzdHJpbmcpOwp2YXIgdDpzdHJpbmc7CmJlZ2luCiAgIHQ6PXg7CiAgIHg6PXk7CiAgIHk6PXQ7CmVuZDsgIApwcm9jZWR1cmUgc2NhbWJpYWNoICh2YXIgeCx5OiBjaGFyKTsKdmFyIHQ6Y2hhcjsKYmVnaW4KICAgdDo9eDsKICAgeDo9eTsKICAgeTo9dDsKZW5kOyAKUHJvY2VkdXJlIG9yZGluYW1lbnRvIChlc3RyZW1vaSxlc3RyZW1vczogcXdvcmQ7IHZhciB2IDogZWxlbmNvOyBvcmRpbmF0bzpib29sZWFuKTsKdmFyIGluZiwgc3VwLCBtZWRpbzpxd29yZDsKICAgIHBpdm90IDpzdHJpbmdbMV07CmJlZ2luCiAgICBpbmY6PWVzdHJlbW9pOwogICAgc3VwOj1lc3RyZW1vczsKICAgIG1lZGlvOj0gKGVzdHJlbW9pK2VzdHJlbW9zKSBkaXYgMjsKICAgIHBpdm90Oj12W21lZGlvXTsKICAgIHJlcGVhdAogICAgICBpZiAob3JkaW5hdG8pIHRoZW4KICAgICAgICAgYmVnaW4KICAgICAgICAgICAgd2hpbGUgKHZbaW5mXTxwaXZvdCkgZG8gIGluZjo9aW5mKzE7CiAgICAgICAgICAgIHdoaWxlICh2W3N1cF0+cGl2b3QpIGRvICBzdXA6PXN1cC0xOwogICAgICAgICBlbmQ7CiAgICAgIGlmIGluZjw9c3VwIHRoZW4KICAgICAgIGJlZ2luCiAgICAgICAgIHNjYW1iaWEodltpbmZdLHZbc3VwXSk7CiAgICAgICAgIGluZjo9aW5mKzE7CiAgICAgICAgIHN1cDo9c3VwLTE7CiAgICAgICBlbmQ7CiAgICB1bnRpbCBpbmY+c3VwOwogICAgaWYgKGVzdHJlbW9pPHN1cCkgdGhlbiBvcmRpbmFtZW50byhlc3RyZW1vaSxzdXAsdixvcmRpbmF0byk7CiAgICBpZiAoaW5mPGVzdHJlbW9zKSB0aGVuIG9yZGluYW1lbnRvKGluZixlc3RyZW1vcyx2LG9yZGluYXRvKTsKZW5kOyAKClByb2NlZHVyZSBpbnZlcnNpb25lICh4OkFuc2lzdHJpbmc7IGluaXppbzpxd29yZDsgIHZhciBTY29uaW52OmFuc2lzdHJpbmcpOwogdmFyIFNkYWludixTcHJlZml4IDogYW5zaXN0cmluZzsKIGJlZ2luCiAgICAgU2RhaW52Oj0nJztTcHJlZml4Oj0nJzsKICAgICBjb3VudDo9bS1pbml6aW8rMTsgCiAgICAgU2RhaW52Oj1jb3B5KHgsaW5pemlvLCBjb3VudCk7IAogICAgIFNwcmVmaXg6PWNvcHkoeCwgMSwgaW5pemlvLTEpOyAKICAgICBzdHJpbmdhaW52ZXJ0aXRhOj1SZXZlcnNlU3RyaW5nKFNkYWludik7CiAgICAgU2Nvbmludjo9U3ByZWZpeCtzdHJpbmdhaW52ZXJ0aXRhOwogZW5kOyAgCgpQcm9jZWR1cmUgbmV4dFBlcm11dGF0aW9uICh2YXIgUCA6IGFuc2lzdHJpbmcpIDsKdmFyIHBpdm90OnF3b3JkOyAgIAogICAoKiBGaW5kIHRoZSBwaXZvdCBpbmRleCopCmJlZ2luIAogICAgcGl2b3QgOj0gMDsgCiAgICBmb3IgaSA6PSBtIC0gMSBkb3dudG8gMSBkbwogICAgICAgICAgICAgICAgICAgIGlmIChQW2ldIDwgUFtpICsgMV0pIHRoZW4gYmVnaW4gcGl2b3Q6PWk7IGJyZWFrOyBlbmQ7CiAgICAgICgqSWYgcGl2b3QgcG9pbnQgZG9lcyBub3QgZXhpc3QsICBleGl0IGRhbGxhIHByb2NlZHVyYSBwZXJjaMOoLCBlc3NlbmRvIGwnYXJyYXkgb3JkaW5hdG8sIGhvIGdpw6AgdHJvdmF0byB0dXR0ZSBsZSBwZXJtdXRhemlvbmkqKQogICAgaWYgcGl2b3QgPSAwIHRoZW4gYmVnaW4gdXNjaXRhOj10cnVlOyBleGl0OyBlbmQ7IAogICAgICAgKCogZmluZCB0aGUgZWxlbWVudCBmcm9tIHRoZSByaWdodCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBwaXZvdCopCiAgICBmb3IgaSA6PSBtICBkb3dudG8gcGl2b3QrMSBkbwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQW2ldID4gUFtwaXZvdF0pICB0aGVuIGJlZ2luIHNjYW1iaWFjaCAoUFtpXSwgUFtwaXZvdF0pOyBicmVhazsgZW5kOwogICAgICAoKlJldmVyc2UgdGhlIGVsZW1lbnRzIGZyb20gcGl2b3QgKyAxIHRvIHRoZSBlbmQgdG8gZ2V0IHRoZSBuZXh0IHBlcm11dGF0aW9uKikKICAgIGlmIHBpdm90KzE9bSB0aGVuIFNjb25pbnY6PVAKICAgICAgICAgICAgICAgICBlbHNlIGludmVyc2lvbmUgKFAsIHBpdm90KzEsIFNjb25pbnYpOwplbmQ7CiAgICAgICAKYmVnaW4KICAgICgqYXNzaWduKGlucHV0LCAgJ2lucHV0LnR4dCcpOyAgcmVzZXQoaW5wdXQpOwogICAgYXNzaWduKG91dHB1dCwgJ291dHB1dC50eHQnKTsgcmV3cml0ZShvdXRwdXQpOyopCiAgICByZWFkbG4obSxrKTsKICAgIHJlYWRsbihjaWZyZSk7CiAgICBmb3IgaTo9MSB0byBtIGRvIGFycm51bVtpXTo9Y29weShjaWZyZSxpLDEpOyAoKnRyYXNmb3JtbyBsYSBzdHJpbmdhIGRpIGlucHV0IGluIHVuIGFycmF5IHBlciBvcmRpbmFybG8gaW4gbW9kbyBjcmVzY2VudGUqKQogICAgb3JkaW5hbWVudG8gKDEsbSxhcnJudW0sIHRydWUpOwogICAgc3RyaW5nYW9yZGluYXRhOj0nJzsgU2Nvbmludjo9Jyc7CiAgICBmb3IgaTo9MCB0byBrLTEgZG8gbW9kcHN3W2ldOj0nJzsgCiAgICBmb3IgaTo9MSB0byBtIGRvIHN0cmluZ2FvcmRpbmF0YTo9c3RyaW5nYW9yZGluYXRhK2Fycm51bVtpXTsgKCpyaXRvcm5vIGRhIGFycmF5IGEgc3RyaW5nYSBwZXIgYXBwbGljYXJlIGxlIHByb2NlZHVyZSopCiAgICBzdHJpbmdhZGFpbnZlcnRpcmU6PXN0cmluZ2FvcmRpbmF0YTsKICAgIHVzY2l0YTo9ZmFsc2U7IHc6PTE7CiAgICB3aGlsZSBzdHJpbmdhZGFpbnZlcnRpcmVbd109JzAnIGRvIHc6PXcrMTsKICAgIHNjYW1iaWFjaChzdHJpbmdhZGFpbnZlcnRpcmVbMV0sIHN0cmluZ2FkYWludmVydGlyZVt3XSk7CiAgICB3aGlsZSAodXNjaXRhPWZhbHNlKSAgZG8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwoc3RyaW5nYWRhaW52ZXJ0aXJlLHBzdyxjb2QpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY29sb21vZDo9cHN3IG1vZCAgazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbW9kcHN3W2NhbGNvbG9tb2RdPScnIHRoZW4gbW9kcHN3W2NhbGNvbG9tb2RdOj1zdHJpbmdhZGFpbnZlcnRpcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYmVnaW4gd3JpdGVsbihzdHJpbmdhZGFpbnZlcnRpcmUpOyAgd3JpdGVsbihtb2Rwc3dbY2FsY29sb21vZF0pOyB1c2NpdGE6PXRydWU7IGV4aXQ7IGVuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzo9dysxOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBlcm11dGF0aW9uKHN0cmluZ2FkYWludmVydGlyZSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdhZGFpbnZlcnRpcmU6PVNjb25pbnY7IAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICB3cml0ZWxuKCctMScpOyAKZW5kLgo=