Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program cat5;
- {$OVERFLOWCHECKS ON}
- var
- a,b,s,s1,s2:QWORD;
- i:integer;
- function root(x: qword; y: integer): Int64;
- var
- k,h,d : qword;
- m,l,r : qword;
- j:integer;
- over:boolean;
- begin
- l:=1;
- r:=x;
- while (r-l>1) do
- begin //Сейчас попробую расписать объяснение задачи
- m:=l+((r-l)div 2);
- j:=y;// В принципе задача не сложное по сути это выделение корня n-ной степени
- k:=m; //И единственная сложность это поимка переполнения
- h:=1; //Буду писать объяснения слегка хаотично, пл этому буду ставить цифры по порядку как читать
- over:=false;
- while (j<>0) do
- begin
- if (j mod 2 = 1) then
- begin
- // Часть 2
- d:= high(qword) div k; // Тут мы делаем такую же проверку как и в первом случае, за одним исключением
- //Чем Ближе наша середина М будет приближаться к корню из большого числа а тем больше свою роль будет играть погрешность целочисленного деление
- if ( high(qword) mod k > 0) then d:=d+1;//Для того чтобы это избежать, мы делаем проверку на остаток при делении
- if ( d > h) then h:=h*k else// если остаток есть мы условно увеличиваем наше число D, что является отношением Qword а и К, на 1
- begin// дальше мы сравниваем D b H и если D оказалось больше то мы делаем обычное умножение
- over:=true; // Иначе говорим что переполнение произошло и выходим их цикла
- break;
- end;
- end;
- //Часть 1
- if (high(qword) div k > k) then k:=k*k else k:=(high(qword));
- j:=j div 2; // Первое выше написана проверка на переполнение делением Qword а на множитель К
- end;// если если полученное при деление число больше К то мы можем выполнять умножение
- //иначе произошло переполнение и мы К приравниваем к Qword у
- // Часть 3
- if (over) then r:=m // Если произошло переполнение, то мы просто сдвигаем правую границу
- //так как мы прекрасно понимаем что если произошло переполнение, то число которое мы ищем 100% меньше этого числа М
- else // Иначе проходим обычную проверку бинарного поиска
- begin
- if (h>x) then r:=m else l:=m;
- end;
- end;
- root:=l;
- end;
- begin
- assign (input,'input.txt');reset(input);
- assign (output,'output.txt');rewrite(output);
- read (a,b);
- s:=0;
- i:=2;
- s1:=0;
- s2:=0;
- while (i<65) do
- begin
- s2:=root (b,i);
- s1:=root (a-1,i);
- s:=s+(s2-s1);
- i:=i+1;
- end;
- write (s);
- close(output);
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement