PROGRAM EULER_PHI;
TYPE LINKED_PTR=^LINK_NODE;
LINK_NODE=RECORD
VALUE:INTEGER;
NEXT:LINKED_PTR;
END;
VAR N,M,I,R:INTEGER;VAR NODE,G:LINKED_PTR;
PROCEDURE PRINTING(PTR:LINKED_PTR);
VAR P:LINKED_PTR;
BEGIN
P:=PTR;
P:=P^.NEXT;
WRITE(' ',R,' ',P^.VALUE);
IF P^.NEXT=NIL THEN EXIT();
PRINTING(P);
R:=R+1;
FREEMEM(P,SIZEOF(LINKED_PTR));
END;
PROCEDURE SUCCESSOR(VAR PTR:LINKED_PTR);
VAR P:LINKED_PTR;
BEGIN
IF PTR^.NEXT=NIL THEN BEGIN
(*CREATE A NEW NODE AND LINK IT TO PREVIOUS ONE*)
PTR^.NEXT:=ALLOCMEM(SIZEOF(LINK_NODE));
P:=PTR^.NEXT;PTR:=P;
END;
END;
PROCEDURE ASSIGNMENT(PTR:LINKED_PTR);
BEGIN
SUCCESSOR(PTR);
END;
PROCEDURE TRAVERSE_ELEMENTS(O:LINKED_PTR; VAR Q:LINKED_PTR;K:INTEGER);
VAR T:INTEGER;
BEGIN
FOR T:=1 TO K DO
BEGIN
SUCCESSOR(O);
END;
Q:=O;
END;
BEGIN
R:=1;
READLN(N);
NODE:=ALLOCMEM(SIZEOF(LINK_NODE));
NODE^.VALUE:=1;
FOR M:=2 TO N DO
BEGIN
ASSIGNMENT(NODE);
END;
M:=2;NODE:=G;
WHILE(M<=N) DO
BEGIN
TRAVERSE_ELEMENTS(NODE,G,M);
IF G^.VALUE=0 THEN BEGIN
I:=M;
WHILE(I<=N) DO
BEGIN
TRAVERSE_ELEMENTS(NODE,G,I);
IF G^.VALUE=0 THEN G^.VALUE:=I;
G^.VALUE:=(G^.VALUE DIV M)*(M-1);
I:=I+M;
END;
M:=M+1;
END;
END;
PRINTING(NODE);
READLN();
END.