| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- var
- inp : file of char;
- chislo : array [1..1000] of byte;
- num,pos : word;
- function GetByte(i:word):byte;
- begin
- GetByte:=(chislo[i div 8 + 1] and (1 shl (8 - i mod 8)));
- end;
- procedure AddByte(bt:char);
- begin
- if (bt='1') then
- chislo[pos div 8 + 1] := chislo[pos div 8 + 1] or (1 shl (8 - pos mod 8));
- inc(pos);
- end;
- Function GetPair(i:word):byte;
- var ret:byte;
- begin
- ret:=0;
- if GetByte(i) <> 0 then ret := 2;
- if GetByte(i+1) <> 0 then inc(ret);
- GetPair:=ret;
- end;
- Function IfModul(l,r:word):boolean;
- var i:word;flag:boolean;sum:integer;
- begin
- i := r-l+1;
- i := i and 1;
- if (i<>0) then
- begin
- i:=1;
- sum := GetByte(l);
- if (sum<>0) then sum:=1;
- end
- else
- begin
- sum:=GetPair(l);
- i:=2;
- end;
- flag:=false;
- while (l+i)<>(r+1) do
- begin
- if flag then sum := sum + GetPair(i+l)
- else sum := sum - GetPair(i+l);
- flag := not flag;
- inc(i,2);
- end;
- while sum > 0 do sum := sum-5;
- if (sum=0) then ifModul:=true
- else ifModul:=false;
- end;
- var
- ch:char;
- i,j:word;
- count : longint;
- flag:boolean;
- BEGIn
- Assign(inp,'num.txt');
- Reset(inp);
- pos:=1;
- num:=0;
- while not EOF(inp) do
- begin
- read(inp,ch);
- if flag or (ch<>'0') then
- begin
- flag := true;
- Addbyte(ch);
- inc(num);
- end
- end;
- count:=0;
- for i := 1 to num-2 do
- for j := i+2 to num do
- if IfModul(i,j) then inc(count);
- Write('Число подстрок, кратных 5: ',count);
- ReadLn;
- END.
|