Program Siever; var a:array[1..70400000] of byte; r:array[1..10000] of longint; p:array[1..2048576] of byte; b:array[0..65535] of longint; f:textfile; g:file; i,q,s:longint; x,pi:int64; begin for q:=0 to 65535 do begin b[q]:=0; s:=q; while s>0 do begin if odd(s) then inc(b[q]); s:=s shr 1 end end; assignfile(g,'primes.dat'); reset(g,1); blockread(g,p,2048576); close(g); assignfile(f,'data.txt'); reset(f); while not eof(f) do readln(f,x,pi); closefile(f); while (x<1e15)and(x>=1e9)and(not odd(x)) do begin if x<1e11 then s:=50000 else if x<1e12 then s:=500000 else if x<1e13 then s:=5000000 else s:=50000000; asm pushfd; pushad; push ds; pop es; {saving registers} mov esi,1000000000; mov [offset q],esi; shr esi,1; {esi = number of bits} fild dword ptr [offset q]; fild qword ptr [offset x]; faddp; {st(0) = x+1e9} fsqrt; fistp dword ptr [offset q]; mov edi,3953000+offset a; mov ebx,3; {q = round(sqrt(x+1e9))} mov eax,[4+offset x]; cdq; div ebx; mov eax,[offset x]; div ebx; {edx = x mod 3} mov ecx,esi; shr ecx,5; add ecx,edx; shl edx,2; sub edi,edx; {initializing counters} cld; mov eax,6DB6DB6Dh; stc; @a:stosd; rcl eax,1; loop @a; {filling the array} mov edi,1+offset p; {initializing} @p:xor eax,eax; mov al,[edi]; inc edi; lea ebx,[ebx+eax*2]; {ebx = next prime} xor edx,edx; lea ecx,[ebx+ebx*2]; {ecx = 3p} mov ebp,[offset x]; mov eax,[4+offset x]; sub ebp,ecx; sbb eax,edx; {eax:ebp = x-3p} shr eax,1; rcr ebp,1; div ecx; mov eax,ebp; div ecx; {edx = ((x-1-3p)/2) mod 3p} lea eax,[ebx-1]; sub ecx,ebx; sub eax,edx; {eax = p-1-[((x-1-3p)/2) mod 3p]} mov edx,3953000+offset a; jc @m; {skipping the first bit if eax<0} @s:btr [edx],eax; @m:add eax,ebx; btr [edx],eax; add eax,ecx; {sieving the array} cmp eax,esi; jb @s; {checking maxbit} cmp ebx,[offset q]; jb @p; {checking maxprime} mov eax,esi; cdq; mov ebp,[offset s]; div ebp; mov [offset q],eax; {q = number of steps} shr ebp,4; mov edi,-4+offset r; lea edi,[edi+eax*4]; {ebp = number of words} mov ecx,3952998+offset a; mov esi,offset b; std; {initializing pointers} @l:xor eax,eax; mov ebx,ebp; {ebx = number of words} @t:mov dx,[ecx+ebx*2]; add eax,[esi+edx*4]; dec ebx; jnz @t; {using a table} stosd; lea ecx,[ecx+ebp*2]; cmp edi,offset r; jnb @l; {next step} popad; popfd {restoring registers} end; append(f); for i:=q downto 1 do begin x:=x+s*2; pi:=pi+r[i]; writeln(f,x,' ',pi) end; closefile(f) end; end.