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 |
Re:附一组数据In Reply To:Re:附一组数据 Posted by:Hoblovski at 2014-03-14 14:02:40 突然发现我是Pascal第一个A的家伙 哈哈哈哈哈.. 这道题解法就是置换的循环分解后欧几里得. 代码丑 求轻喷 program poj3708; const maxn=217; type bit=array[0..500] of longint; var d,i,j:longint; n,m,t:bit; pa,pb,rb,pob,ra,poa,ca,cb:array[0..maxn] of longint; a,b:array[0..maxn] of int64; function rep(i,n:int64):int64; begin exit((i mod n+n) mod n); end; procedure exgcd(var d,x,y:int64;i,j:int64); var z:int64; begin if j=0 then begin d:=i; x:=1; y:=0; end else begin exgcd(d,x,y,j,i mod j); z:=x-(i div j)*y; x:=y; y:=z; end; end; function max(a,b:int64):int64; begin if a>b then exit(a) else exit(b); end; procedure cvr(a:bit;d:longint); var i,j:longint; begin fillchar(t,sizeof(t),0); while a[0]>0 do begin inc(t[0]); for i:=a[0] downto 2 do begin inc(a[i-1],a[i] mod d * 100); a[i]:=a[i] div d; end; t[t[0]]:=a[1] mod d; a[1]:=a[1] div d; while (a[0]>0)and(a[a[0]]=0) do dec(a[0]); end; end; procedure scan(var n:bit); var i,j:longint; ch:char; begin fillchar(n,sizeof(n),0); while not seekeoln do begin inc(n[0]); read(ch); n[n[0]]:=ord(ch)-48; end; readln; for i:=1 to n[0]>>1 do begin j:=n[i]; n[i]:=n[n[0]+1-i]; n[n[0]+1-i]:=j; end; for i:=1 to n[0]>>1+(n[0] and 1) do n[i]:=n[i<<1-1]+n[i<<1]*10; n[0]:=n[0]>>1+(n[0] and 1); cvr(n,d); n:=t; end; function buildequ:boolean; var i,j,k:longint; begin if ca[m[m[0]]]<>ca[n[n[0]]] then exit(false); a[1]:=ra[m[m[0]]]; b[1]:=rep(poa[n[n[0]]]-poa[m[m[0]]],a[1]); for i:=2 to m[0] do begin if cb[m[m[0]+1-i]]<>cb[n[n[0]+1-i]] then exit(false); a[i]:=rb[m[m[0]+1-i]]; b[i]:=rep(pob[n[n[0]+1-i]]-pob[m[m[0]+1-i]],a[i]); end; exit(true); end; function init:boolean; var i,j,k,col:longint; flag:boolean; begin fillchar(pa,sizeof(pa),0); fillchar(pb,sizeof(pb),0); fillchar(ra,sizeof(ra),0); fillchar(rb,sizeof(rb),0); fillchar(ca,sizeof(ca),0); fillchar(cb,sizeof(cb),0); readln(d); if d=-1 then begin halt; end; for i:=1 to d-1 do read(pa[i]); col:=0; for i:=1 to d-1 do if ra[i]=0 then begin j:=i; k:=0; inc(col); repeat inc(k); poa[j]:=k; ca[j]:=col; j:=pa[j]; until j=i; repeat ra[j]:=k; j:=pa[j]; until j=i; end; for i:=0 to d-1 do read(pb[i]); col:=0; for i:=0 to d-1 do if rb[i]=0 then begin j:=i; k:=0; inc(col); repeat inc(k); pob[j]:=k; cb[j]:=col; j:=pb[j]; until j=i; repeat rb[j]:=k; j:=pb[j]; until j=i; end; readln; scan(m); scan(n); m[0]:=max(m[0],n[0]); n[0]:=m[0]; flag:=false; for i:=1 to n[0] do if m[i]<>n[i] then begin flag:=true; break; end; if not flag then begin writeln(0); exit(false); end; if buildequ then exit(true); writeln('NO'); exit(false); end; function modsys(k:longint):int64; var i,j:longint; tb,ta,d,x,y:int64; begin tb:=b[1]; ta:=a[1]; for i:=2 to k do begin exgcd(d,x,y,a[i],ta); if (tb-b[i]) mod d <> 0 then exit(-1); ta:=ta div d * a[i]; tb:=rep((((tb-b[i]) div d)*x mod ta)*a[i]+b[i],ta); end; exit(tb); end; procedure work; var i:int64; begin i:=modsys(m[0]); if i=-1 then writeln('NO') else writeln(i); end; begin while not seekeof do if init then work; end. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator