{---------------------------------------------------------------------
 - Subiect:
   Bunica mea are un ceas cu cuc care canta la ore fixe (de numarul de 
   ori egal cu ora) si la "si jumatate" (o singura data). 
   Pe ceasul bunicii orele sunt numerotate de la 1 la 12. 
   Eu am plecat de acasa exact dupa ce cucul a cantat de ora fixa si 
   am lipsit cel putin o ora. 
   Dupa ce m-am intors, cucul a cantat de "si jumatate" si bunica 
   suparata mi-a spus "De cand ai plecat, cucul a canat de k ori!"
 
 - Cerinta:
   Fiindca nu inteleg de ce bunica mea e asa de suparata, scrieti un 
   program care sa determine numarul minim de ore ce am lipsit de acasa!
 ---------------------------------------------------------------------}
Program Cucul ;
uses crt ;
const max_cuc = 1000000000 ;
var   P, L, k: longint ;
      k_calc, L_min, P_: longint ;

function Sn(m, n: integer): longint ;
begin  Sn := (n-m+1) * (n+m) div 2 ; end ;

function Cucu_12: word ; 
begin Cucu_12 := Sn(1, 12) + 12 ; end ;

function k_(P, L: Word): longint ; 
var rez: longint ;
begin
   rez := Cucu_12 * (L div 12) ; 
   L := L mod 12 ;               
   while L > 0 do begin
     dec(L) ;              
     P := P mod 12 + 1 ;   
     inc(rez, 1 + P) ;     
   end ;
   k_ := rez ;
end ;

BEGIN
clrscr ;
   
   WriteLn('Daca lipseam 12 ore, cucu canta de ', Cucu_12, ' ori!'#10) ;
   Write('De cate ori a cantat cucul?  ') ;  ReadLn(k) ;
   P_ := 0 ;
   
   L_min := 12 * (k div Cucu_12) ;
   if L_min = 0 then L_min := 1;

   for P := 1 to 12 do begin 
     L := L_min ;
     repeat
        k_calc := k_(P, L) ;    
        if k_calc = k then      
        if  L <= L_min then begin 
           L_min := L ;
           P_    := P ;
           Break ;  
        end ;
        inc(L) ;
     until not( (0 < k_calc)and(k_calc < max_cuc)and(k_calc <= k) ) ;
   end ;

if P_ <> 0 then WriteLn('Am iesit din casa la ora ', P_:2, ' si am lipsit ', L_min:2, ' ore.') 
           else WriteLn('Nu am iesit din casa...');

readkey ;
END.
