| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我要吐血了,我O(XP)复杂度的PolTLE,请教怎样优化?(程序供参考)var
m,i,j,p,t,ti,l:longint;
n,s,a,b:int64;
w:array[1..30000] of int64;
f:array[0..30000] of boolean;
flag:boolean;
begin
readln(t);
for ti:=1 to t do
begin
readln(m,p);
n:=m;
w[1]:=1 mod p;
l:=1;
fillchar(f,sizeof(f),false);
flag:=false;
repeat
inc(l);
w[l]:=(w[l-1]*(n mod p)) mod p;
j:=w[l];
if f[j] then
begin
flag:=true;
break;
end;
f[j]:=true;
until l=m;
if flag then
begin
dec(l);
for i:=1 to l do
if w[i]=w[l+1] then break;
for j:=i to l do w[j-i+1]:=w[j];
l:=l-i+1;
s:=w[((m-i) mod l+1)];
end
else s:=w[m];
if odd(n) then
begin
a:=1 mod p;
b:=(n-1) mod p;
s:=(s+a*b) mod p;
end
else
begin
a:=n mod p;
b:=(n div 2) mod p;
s:=(s+b) mod p;
b:=(n div 2-1) mod p;
s:=(s+(a mod p)*b) mod p;
end;
writeln(s);
end;
end.
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator