题解 P5000 【Hillwer编码】

· · 题解

出题人的题解

真的不想说什么,在比赛本题为颂纷题,如果这都送不进的话,建议再学习一下高精度模板。可在比赛中,还是有人打不出高精。现在普及选手可以用来加深高精的印象,但为何此题的难度是提高+/省选-。难道是错误率高导致的???

简单题意:

将字符串移位,在将其ASCLL码相乘(ord(pascal),(int)(C++))高精。

部分分获取:

打暴力30分。(开long long(C++) int64(pascal))

高精满分

高精

不多说,实在不行自己背板去吧。我也帮不了你。

总结

很好奇这个标签是怎么计算的。但我为洛谷的P5000感到高兴,为大家的支持高兴。

代码(跑得慢,作者懒得打更快的)

var n,r,i,j,k,t,j1,lb,len,x,y:longint;s:ansistring;
a,b,c:array[0..10000] of longint;
begin
  assign(input,'hillwer.in');reset(input);
  assign(output,'hillwer.out');rewrite(output);
  readln(n,r);r:=r mod 26;
  for i:=1 to n do
  begin
    readln(s);
    for j:=1 to length(s) do
    begin
      for k:=1 to r do//这里可以优化直接((ord(s[j])-64)+r-1)mod 26+1
       if s[j]='Z' then s[j]:='A' else s[j]:=succ(s[j]);
      write(s[j]);
    end;writeln;
    fillchar(a,sizeof(a),0);
    lb:=2;len:=1;a[1]:=1;
    for j:=1 to length(s) do//高精乘
    begin
      y:=ord(s[j]);
      b[1]:=y mod 10;
      b[2]:=y div 10;
      fillchar(c,sizeof(c),0);
      for k:=1 to len do
      begin
        x:=0;
        for t:=1 to lb do
        begin
          c[k+t-1]:=a[k]*b[t]+x+c[k+t-1];
          x:=c[k+t-1] div 10;
          c[k+t-1]:=c[k+t-1] mod 10;
        end;
        c[k+t]:=x;
      end;
      len:=len+lb;a:=c;
      while (c[len]=0)and(len>0) do dec(len);
    end;
    for j:=len downto 1 do write(c[j]);writeln;
  end;
  close(input);
  close(output);
end.