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 ; (*in questo array l'indice indica il resto della divisione per k; nell'array l'elemento di posto i è la stringa il cui valore numerico diviso per k ha resto i*)
pot : array [ 0 .. MAX ] of qword;
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 ;
procedure calcolapsw ( ss : ansistring ) ;
var h : qword;
begin
psw: = 0 ;
for h: = 0 to m - 1 do
begin
psw : = psw+ pot[ h] * ( ord ( ss[ m - h] ) - 48 ) ;
calcolomod: = psw mod k;
end ;
writeln ( 'psw' , psw) ;
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: = '' ;
pot[ 0 ] : = 1 ;
for i: = 1 to m - 1 do pot[ i] : = 10 * pot[ i- 1 ] ;
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 ; (*tolgo gli zeri iniziali, mettendo in prima posizione la prima cifra diversa da zero*)
scambiach( stringadainvertire[ 1 ] , stringadainvertire[ w] ) ;
while ( uscita= false ) do
begin
calcolapsw( stringadainvertire) ;
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 .
cHJvZ3JhbSB3YXJkcm9iZTM7ClVzZXMgU3RydXRpbHM7CmNvbnN0IE1BWCA9IDUwMDAwMDA7CnR5cGUgZWxlbmNvID0gYXJyYXlbMS4uTUFYXSBvZiBzdHJpbmdbMV07CnZhciBtLGssaSx3LCBjYWxjb2xvbW9kLCBwc3c6cXdvcmQ7CiAgICBjb3VudCA6IHF3b3JkOwogICAgY29kIDogbG9uZ2ludDsKICAgIGNpZnJlLCBzdHJpbmdhZGFpbnZlcnRpcmUsIHN0cmluZ2FpbnZlcnRpdGEsIHN0cmluZ2FvcmRpbmF0YSwgU2NvbmludiA6IEFuc2lzdHJpbmc7CiAgICBhcnJudW0gOmFycmF5IFsxLi5NQVhdIG9mICBzdHJpbmdbMV07CiAgICBtb2Rwc3cgOmFycmF5IFsxLi5NQVhdIG9mICBBbnNpc3RyaW5nOyAoKmluIHF1ZXN0byBhcnJheSBsJ2luZGljZSBpbmRpY2EgaWwgcmVzdG8gZGVsbGEgZGl2aXNpb25lIHBlciBrOyBuZWxsJ2FycmF5IGwnZWxlbWVudG8gZGkgcG9zdG8gaSDDqCBsYSBzdHJpbmdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWwgY3VpIHZhbG9yZSBudW1lcmljbyBkaXZpc28gcGVyIGsgaGEgcmVzdG8gaSopCiAgICBwb3QgOiBhcnJheVswLi5NQVhdIG9mIHF3b3JkOyAgICAKdXNjaXRhOmJvb2xlYW47CiAgICAKcHJvY2VkdXJlIHNjYW1iaWEgKHZhciB4LHk6IHN0cmluZyk7CnZhciB0OnN0cmluZzsKYmVnaW4KICAgdDo9eDsKICAgeDo9eTsKICAgeTo9dDsKZW5kOyAgCnByb2NlZHVyZSBzY2FtYmlhY2ggKHZhciB4LHk6IGNoYXIpOwp2YXIgdDpjaGFyOwpiZWdpbgogICB0Oj14OwogICB4Oj15OwogICB5Oj10OwplbmQ7IApQcm9jZWR1cmUgb3JkaW5hbWVudG8gKGVzdHJlbW9pLGVzdHJlbW9zOiBxd29yZDsgdmFyIHYgOiBlbGVuY287IG9yZGluYXRvOmJvb2xlYW4pOwp2YXIgaW5mLCBzdXAsIG1lZGlvOnF3b3JkOwogICAgcGl2b3QgOnN0cmluZ1sxXTsKYmVnaW4KICAgIGluZjo9ZXN0cmVtb2k7CiAgICBzdXA6PWVzdHJlbW9zOwogICAgbWVkaW86PSAoZXN0cmVtb2krZXN0cmVtb3MpIGRpdiAyOwogICAgcGl2b3Q6PXZbbWVkaW9dOwogICAgcmVwZWF0CiAgICAgIGlmIChvcmRpbmF0bykgdGhlbgogICAgICAgICBiZWdpbgogICAgICAgICAgICB3aGlsZSAodltpbmZdPHBpdm90KSBkbyAgaW5mOj1pbmYrMTsKICAgICAgICAgICAgd2hpbGUgKHZbc3VwXT5waXZvdCkgZG8gIHN1cDo9c3VwLTE7CiAgICAgICAgIGVuZDsKICAgICAgaWYgaW5mPD1zdXAgdGhlbgogICAgICAgYmVnaW4KICAgICAgICAgc2NhbWJpYSh2W2luZl0sdltzdXBdKTsKICAgICAgICAgaW5mOj1pbmYrMTsKICAgICAgICAgc3VwOj1zdXAtMTsKICAgICAgIGVuZDsKICAgIHVudGlsIGluZj5zdXA7CiAgICBpZiAoZXN0cmVtb2k8c3VwKSB0aGVuIG9yZGluYW1lbnRvKGVzdHJlbW9pLHN1cCx2LG9yZGluYXRvKTsKICAgIGlmIChpbmY8ZXN0cmVtb3MpIHRoZW4gb3JkaW5hbWVudG8oaW5mLGVzdHJlbW9zLHYsb3JkaW5hdG8pOwplbmQ7IAoKUHJvY2VkdXJlIGludmVyc2lvbmUgKHg6QW5zaXN0cmluZzsgaW5pemlvOnF3b3JkOyAgdmFyIFNjb25pbnY6YW5zaXN0cmluZyk7CiB2YXIgU2RhaW52LFNwcmVmaXggOiBhbnNpc3RyaW5nOwogYmVnaW4KICAgICBTZGFpbnY6PScnO1NwcmVmaXg6PScnOwogICAgIGNvdW50Oj1tLWluaXppbysxOyAKICAgICBTZGFpbnY6PWNvcHkoeCxpbml6aW8sIGNvdW50KTsgCiAgICAgU3ByZWZpeDo9Y29weSh4LCAxLCBpbml6aW8tMSk7IAogICAgIHN0cmluZ2FpbnZlcnRpdGE6PVJldmVyc2VTdHJpbmcoU2RhaW52KTsKICAgICBTY29uaW52Oj1TcHJlZml4K3N0cmluZ2FpbnZlcnRpdGE7CiBlbmQ7ICAKClByb2NlZHVyZSBuZXh0UGVybXV0YXRpb24gKHZhciBQIDogYW5zaXN0cmluZykgOwp2YXIgcGl2b3Q6cXdvcmQ7ICAgCiAgICgqIEZpbmQgdGhlIHBpdm90IGluZGV4KikKYmVnaW4gCiAgICBwaXZvdCA6PSAwOyAKICAgIGZvciBpIDo9IG0gLSAxIGRvd250byAxIGRvCiAgICAgICAgICAgICAgICAgICAgaWYgKFBbaV0gPCBQW2kgKyAxXSkgdGhlbiBiZWdpbiBwaXZvdDo9aTsgYnJlYWs7IGVuZDsKICAgICAgKCpJZiBwaXZvdCBwb2ludCBkb2VzIG5vdCBleGlzdCwgIGV4aXQgZGFsbGEgcHJvY2VkdXJhIHBlcmNow6gsIGVzc2VuZG8gbCdhcnJheSBvcmRpbmF0bywgaG8gZ2nDoCB0cm92YXRvIHR1dHRlIGxlIHBlcm11dGF6aW9uaSopCiAgICBpZiBwaXZvdCA9IDAgdGhlbiBiZWdpbiB1c2NpdGE6PXRydWU7IGV4aXQ7IGVuZDsgCiAgICAgICAoKiBmaW5kIHRoZSBlbGVtZW50IGZyb20gdGhlIHJpZ2h0IHRoYXQgaXMgZ3JlYXRlciB0aGFuIHBpdm90KikKICAgIGZvciBpIDo9IG0gIGRvd250byBwaXZvdCsxIGRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBbaV0gPiBQW3Bpdm90XSkgIHRoZW4gYmVnaW4gc2NhbWJpYWNoIChQW2ldLCBQW3Bpdm90XSk7IGJyZWFrOyBlbmQ7CiAgICAgICgqUmV2ZXJzZSB0aGUgZWxlbWVudHMgZnJvbSBwaXZvdCArIDEgdG8gdGhlIGVuZCB0byBnZXQgdGhlIG5leHQgcGVybXV0YXRpb24qKQogICAgaWYgcGl2b3QrMT1tIHRoZW4gU2Nvbmludjo9UAogICAgICAgICAgICAgICAgIGVsc2UgaW52ZXJzaW9uZSAoUCwgcGl2b3QrMSwgU2Nvbmludik7CmVuZDsKCnByb2NlZHVyZSBjYWxjb2xhcHN3IChzcyA6YW5zaXN0cmluZyk7CnZhciAgaCA6cXdvcmQ7CmJlZ2luICAgCiAgICBwc3c6PSAwOwogICAgZm9yIGg6PSAwIHRvIG0gLSAxIGRvCgkJYmVnaW4KICAgICAgICAgICAgcHN3IDo9IHBzdytwb3RbaF0gKiAob3JkKHNzW20gLSBoXSkgLTQ4KTsKCQkJY2FsY29sb21vZDo9cHN3IG1vZCBrOwoJCWVuZDsKICAgIHdyaXRlbG4oJ3BzdycsIHBzdykJOwkKZW5kOyAgCiAgICAgICAKYmVnaW4KICAgICgqYXNzaWduKGlucHV0LCAgJ2lucHV0LnR4dCcpOyAgcmVzZXQoaW5wdXQpOwogICAgYXNzaWduKG91dHB1dCwgJ291dHB1dC50eHQnKTsgcmV3cml0ZShvdXRwdXQpOyopCiAgICByZWFkbG4obSxrKTsKICAgIHJlYWRsbihjaWZyZSk7CiAgICBmb3IgaTo9MSB0byBtIGRvIGFycm51bVtpXTo9Y29weShjaWZyZSxpLDEpOyAoKnRyYXNmb3JtbyBsYSBzdHJpbmdhIGRpIGlucHV0IGluIHVuIGFycmF5IHBlciBvcmRpbmFybG8gaW4gbW9kbyBjcmVzY2VudGUqKQogICAgb3JkaW5hbWVudG8gKDEsbSxhcnJudW0sIHRydWUpOwogICAgc3RyaW5nYW9yZGluYXRhOj0nJzsgU2Nvbmludjo9Jyc7CiAgICBwb3RbMF06PTE7IAogICAgZm9yIGk6PTEgdG8gbSAtMSAgZG8gcG90W2ldOj0xMCpwb3RbaS0xXTsgIAogICAgZm9yIGk6PTAgdG8gay0xIGRvIG1vZHBzd1tpXTo9Jyc7IAogICAgZm9yIGk6PTEgdG8gbSBkbyBzdHJpbmdhb3JkaW5hdGE6PXN0cmluZ2FvcmRpbmF0YSthcnJudW1baV07ICgqcml0b3JubyBkYSBhcnJheSBhIHN0cmluZ2EgcGVyIGFwcGxpY2FyZSBsZSBwcm9jZWR1cmUqKQogICAgc3RyaW5nYWRhaW52ZXJ0aXJlOj1zdHJpbmdhb3JkaW5hdGE7CiAgICB1c2NpdGE6PWZhbHNlOyB3Oj0xOwogICAgd2hpbGUgc3RyaW5nYWRhaW52ZXJ0aXJlW3ddPScwJyBkbyB3Oj13KzE7ICAoKnRvbGdvIGdsaSB6ZXJpIGluaXppYWxpLCBtZXR0ZW5kbyBpbiBwcmltYSBwb3NpemlvbmUgbGEgcHJpbWEgY2lmcmEgZGl2ZXJzYSBkYSB6ZXJvKikKICAgIHNjYW1iaWFjaChzdHJpbmdhZGFpbnZlcnRpcmVbMV0sIHN0cmluZ2FkYWludmVydGlyZVt3XSk7CiAgICB3aGlsZSAodXNjaXRhPWZhbHNlKSAgZG8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjb2xhcHN3KHN0cmluZ2FkYWludmVydGlyZSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtb2Rwc3dbY2FsY29sb21vZF09JycgdGhlbiBtb2Rwc3dbY2FsY29sb21vZF06PXN0cmluZ2FkYWludmVydGlyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBiZWdpbiB3cml0ZWxuKHN0cmluZ2FkYWludmVydGlyZSk7ICB3cml0ZWxuKG1vZHBzd1tjYWxjb2xvbW9kXSk7IHVzY2l0YTo9dHJ1ZTsgZXhpdDsgZW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Oj13KzE7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGVybXV0YXRpb24oc3RyaW5nYWRhaW52ZXJ0aXJlKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2FkYWludmVydGlyZTo9U2NvbmludjsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgIHdyaXRlbG4oJy0xJyk7IAplbmQu