回 帖 发 新 帖 刷新版面

主题:帮我解题!《循环》

第十一届全国青少年奥林匹克信息学联赛复赛普及组试题

循环
(circle.pas/c/cpp)

【问题描述】

乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。
众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:
     循环    循环长度
2    2、4、8、6    4
3    3、9、7、1    4
4    4、6    2
5    5    1
6    6    1
7    7、9、3、1    4
8    8、4、2、6    4
9    9、1    2
这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?
注意:
1.  如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。
2.  如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a + L次幂的最后k位都相同。

【输入文件】

输入文件circle.in只有一行,包含两个整数n(1 <= n < 10100)和k(1 <= k <= 100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。

【输出文件】

输出文件circle.out包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。

【样例输入】

32 2

【样例输出】

4

【数据规模】

对于30%的数据,k <= 4;
对于全部的数据,k <= 100。

回复列表 (共1个回复)

沙发

const max=100;
type hint=array[0..max]of longint;
var st,s1,s2:string; k,ok:longint;
    a:array[0..11]of hint;
    b:array[0..9]of longint;
    circle:array[0..max]of longint;
    tot:hint;
    n,start:hint; sc,ss:hint;
    i,j,ij,l,m:longint;
procedure multi(var a:hint;b,c:hint);
var i,j,e:longint;
begin
  fillchar(a,sizeof(a),0);
  for i:=0 to k-1 do
    for j:=0 to k-1 do
      if i+j<=k-1 then inc(a[i+j],b[i]*c[j]);
  e:=0;
  for i:=0 to k-1 do begin
    a[i]:=a[i]+e;
    e:=a[i] div 10;
    a[i]:=a[i] mod 10;
  end;
end;
procedure mult(var a:hint; b:longint);
var i,e:longint;
begin
  for i:=0 to a[max] do a[i]:=a[i]*b;
  e:=0;
  for i:=0 to a[max]+1 do begin
    a[i]:=a[i]+e;
    e:=a[i] div 10;
    a[i]:=a[i] mod 10;
  end;
  if a[a[max]+1]>0 then a[max]:=a[max]+1;
end;
begin
  assign(input,'circle.in'); reset(input);
  assign(output,'circle.out'); rewrite(output);
  readln(st);
  s1:=copy(st,1,pos(' ',st)-1); delete(st,1,pos(' ',st)-1);
  s2:=st; while pos(' ',s2)>0 do delete(s2,pos(' ',s2),1);
  val(s2,k,ok);
  s2:=copy(s1,length(s1)-k+1,k);
  while length(s2)<k do s2:='0'+s2;
  for i:=1 to k do n[k-i]:=ord(s2[i])-48; n[max]:=k-1;
  start:=n; ss:=n; a[1]:=ss;
  for i:=0 to k-1 do begin
    fillchar(b,sizeof(b),0); b[a[1,i]]:=1;
    j:=2;
    while true do begin
      multi(a[j],a[j-1],ss);
      if b[a[j,i]]=0
      then begin b[a[j,i]]:=j; inc(j); end
      else begin
             sc:=ss; ij:=b[a[j,i]];
             if ij<>1
               then begin writeln(-1); close(input); close(output); halt;end;
             circle[i]:=j-1;
             for ij:=2 to j-1 do multi(ss,sc,ss);
             {a[1]:=a[b[a[j,i]]];} j:=2; break;
           end;
    end;
  end;
  fillchar(tot,sizeof(tot),0); tot[0]:=1;
  for i:=1 to k do mult(tot,circle[i-1]);
  for i:=k-1 downto 0 do if tot[i]>0 then break;
  for j:=i downto 0 do write(tot[j]);
  close(input); close(output);
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册