Текущий архив: 2004.02.06;
Скачать: CL | DM;
Вниз
В чем ошибка? Найти похожие ветки
← →
Chuha (2004-01-25 19:41) [0]В чем ошибка? Даны три числа N,M,Y(0<n<999,0<m<999,0<y<99)
Нужно найти все числа из диапазона 0..M-1, таких которые выполняют условие: X^N MOD m = y
var m,n,y,t,i,k,count:integer;
x:longint;
a:array[1..999]of longint;
begin
count:=0;
readln(n,m,y);
for i:=0 to m-1 do
begin
x:=1;
for k:=1 to n do
begin
x:=x*i;
end;
t:=x mod m;
if t= y then
begin
inc(count);
a[count]:=i;
end;
end;
if count<>0 then
begin
for i:=1 to count do
begin
Write(a[i]);
if i<>count then write(" ");
end;
end
else
begin
Writeln("-1");
end;
end.
Вроде правильно! ?? Если что вот уловие : http://acm.timus.ru/problem.aspx?space=1&num=1110
← →
Palladin © (2004-01-25 19:46) [1]ты вышел за ограничение памяти... и скорее всего за ограничение времени...
основной цикл
bPresent:=false;
for i:=0 to m-1 do
if trunc(exp(ln(i)*n)) mod m=y then
begin
writeln(i);
bPresent:=true;
end;
if not bPresent then writeln("-1");
← →
Chuha (2004-01-25 20:01) [2]Все равно возникает ошибка:FLT_INVALID_OPERATION
← →
Palladin © (2004-01-25 20:06) [3]правильно :) ln нуля не сущестувует...
проверяй отдельно при случае x=0 вне цикла...
и for i:=1 to...
← →
Chuha (2004-01-25 20:40) [4]Я исключил ноль, но все равно возникает ошибка. При прохождении 3го теста. Изи-за чего это может быть? (Спасибо за помощь :) )
← →
jack128 © (2004-01-25 21:00) [5]program Project1;
{$APPTYPE CONSOLE}
//Изьято из Math;
function IntPower(Base: Extended; Exponent: Integer): Extended;
asm
mov ecx, eax
cdq
fld1 { Result := 1 }
xor eax, edx
sub eax, edx { eax := Abs(Exponent) }
jz @@3
fld Base
jmp @@2
@@1: fmul ST, ST { X := Base * Base }
@@2: shr eax,1
jnc @@1
fmul ST(1),ST { Result := Result * X }
jnz @@1
fstp st { pop X from FPU stack }
cmp ecx, 0
jge @@3
fld1
fdivrp { Result := 1 / Result }
@@3:
fwait
end;
var
N, M, Y: Word;
x : Word;
begin
Write("N = ? ");
ReadLn(N);
Write("M = ? ");
ReadLn(M);
Write("Y = ? ");
ReadLn(Y);
for x := 1 to M - 1 do
if (Trunc(IntPower(X, N)) mod M) = Y then
Write(X, " ");
ReadLn;
end.
← →
Goida © (2004-01-25 23:55) [6]Попробуй использовать вот этот алгоритм:
число х в степени р по модулю n равно... и дальше ты сравниваешь.
Может, конечно, вариант с асмом лучше? Не смотрел его - не знаю.
function ExpMod(x,p,n: int64): int64;
var
Res: int64;
begin
if p = 0
then begin
Result := 1;
exit
end;
if (p mod 2) = 0
then begin
Res := expmod(x, p div 2, n);
Result := (Res*Res) mod n;
exit
end;
Result := (x*expmod(x, p-1, n)) mod n;
end;
← →
Легионер (2004-01-26 09:48) [7]На Паскале же так не получится сделать? Или как?
Страницы: 1 вся ветка
Текущий архив: 2004.02.06;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.02 c