| 
 | 
вернуться в форумWhy I get WA?I know maybe my algorithm is not the best one. if input is 1 4 What should I output? 1 4 OR 1 1 ?   and my program: const   max = 10000; var   num : array [1..max] of integer;   o1 , o2 : array [0..max-1] of boolean;   pre : array [0..max-1] of integer;   i , j , n : integer; procedure init; begin   readln(n);   for i := 1 to n do     readln(num[i]);   fillchar(o1,sizeof(o1),0);   o1[0] := true;   fillchar(pre,sizeof(pre),0); end; procedure out; var   link , tot : integer;   sz : array [1..max] of integer; begin   fillchar(sz,sizeof(sz),0);   tot := 0;   link := 0;   repeat     inc(tot);     sz[tot] := pre[link];     link := (link + n - num[pre[link]] mod n) mod n;   until link = 0;   writeln(tot);   for link := 1 to tot do     writeln(sz[link]);   halt; end;       procedure solve; begin   for i := 1 to n do begin     o2 := o1;     for j := 0 to n - 1 do       if (o1[j]) and (pre[(j+num[i] mod n) mod n] = 0) then begin         o2[(j+num[i] mod n) mod n] := true;         pre[(j+num[i] mod n) mod n] := i;       end;     if (o2[j] = true) and (pre[0]<>0) then out;     o1 := o2;   end; end;     begin   init;   solve;   writeln(0); end.   I think it's O(n^2),maybe TIME LIMIT EXCEED,but NOW I GET WA! You may think an O(n) algo (+) as they give you N values the next expresion: Sum(first i elements) mod N gives you in worst case, N different values, one of them of course is equal to zero.       > const >   max = 10000; > var >   num : array [1..max] of integer; >   o1 , o2 : array [0..max-1] of boolean; >   pre : array [0..max-1] of integer; >   i , j , n : integer; > procedure init; > begin >   readln(n); >   for i := 1 to n do >     readln(num[i]); >   fillchar(o1,sizeof(o1),0); >   o1[0] := true; >   fillchar(pre,sizeof(pre),0); > end; > procedure out; > var >   link , tot : integer; >   sz : array [1..max] of integer; > begin >   fillchar(sz,sizeof(sz),0); >   tot := 0; >   link := 0; >   repeat >     inc(tot); >     sz[tot] := pre[link]; >     link := (link + n - num[pre[link]] mod n) mod n; >   until link = 0; >   writeln(tot); >   for link := 1 to tot do >     writeln(sz[link]); >   halt; > end; > > > > procedure solve; > begin >   for i := 1 to n do begin >     o2 := o1; >     for j := 0 to n - 1 do >       if (o1[j]) and (pre[(j+num[i] mod n) mod n] = 0) then begin >         o2[(j+num[i] mod n) mod n] := true; >         pre[(j+num[i] mod n) mod n] := i; >       end; >     if (o2[j] = true) and (pre[0]<>0) then out; >     o1 := o2; >   end; > end; > > > begin >   init; >   solve; >   writeln(0); > end. > > I think it's O(n^2),maybe TIME LIMIT EXCEED,but NOW I GET WA! >  |  
  | 
|