回 帖 发 新 帖 刷新版面

主题:help!tju1164超时1s

Peach - 猴子分桃
Time Limit:2s Memory Limit:65536k
Total Submit:1558 Accepted:150


--------------------------------------------------------------------------------

Problem
现在有一堆桃子,N只猴子要平均分这些桃子。第一只猴子来了,它等了很久,其他猴子都不来,于是它把桃子平均分成了N堆,最后余下一个桃子,它觉得自己分桃辛苦了,于是就把那个多余的桃子吃掉了,结果是,这只猴子吃掉了一个桃子,又从中拿走了N堆中的一堆。接着第二只猴子来了,它并不知道先前已经来过一只。它想,N只猴子怎么分N-1堆桃子呢?于是它把所有桃子合在一起,重新分成N堆,又剩下一只,它吃了剩的桃子,又拿了一堆桃子……以后几只猴子也是这么做的。问原来至少有多少桃子?最后至少剩多少桃子?

Input
本题有多组测试数据。每组数据包括一个整数N(3 <= N <= 1000),代表猴子的个数。

Output
对于每组数据,输出一行两个数字:原来桃子的个数和剩下桃子的个数,两个数字之间用空格分开。

Sample Input
3

Sample Output
25 6

Source
1st Anniversary of TOJ Day1

我的程序:
program p1164;
const h=1000;
      maxl=1001;
var ans1:array[1..maxl] of integer;
    ans2:array[1..maxl] of integer;
    i,j:integer;
    n:integer;

procedure work;
var i,j:integer;
    k1,k2:longint;
begin
  fillchar(ans2,sizeof(ans2),0);
  fillchar(ans1,sizeof(ans1),0);
  ans2[maxl]:=1;
  ans1[maxl]:=1;
  for i:=1 to n do
    begin
      k1:=0;k2:=0;
      for j:=maxl downto 1 do
        begin
          k1:=n*ans1[j]+k1;
          k2:=(n-1)*ans2[j]+k2;
          ans1[j]:=k1 mod h;
          ans2[j]:=k2 mod h;
          k1:=k1 div h;
          k2:=k2 div h;
        end;
    end;
   ans1[maxl]:=ans1[maxl]-n+1;
   ans2[maxl]:=ans2[maxl]-n+1;
   j:=maxl;
   while ans1[j]<0 do begin dec(ans1[j-1]);ans1[j]:=ans1[j]+h;dec(j); end;
   j:=1;
  while ans1[j]=0 do inc(j);
  write(ans1[j]);
  for i:=j+1 to maxl do
    write(ans1[i] div 100,ans1[i] div 10 mod 10,ans1[i] mod 10);
  write(' ');
   j:=maxl;
   while ans2[j]<0 do begin dec(ans2[j-1]);ans2[j]:=ans2[j]+h;dec(j); end;
  j:=1;
  while ans2[j]=0 do inc(j);
  write(ans2[j]);
  for i:=j+1 to maxl do
    write(ans2[i] div 100,ans2[i] div 10 mod 10,ans2[i] mod 10);
  writeln;
end;
begin
repeat
  read(n);
  work;
until seekeof;
end.

在tju测试中时间3000ms,请各位大侠帮忙修改修改

回复列表 (共2个回复)

沙发

各位大侠快来帮我!!!

板凳

program tju1164;
const
  maxn=1000;
  base=10000;
type
  bignum=array[-1..751]of longint;
var
  a,b:bignum;
  n,m:word;
procedure square(var a,b:bignum);
  var
    i,j,k:word;
  begin
    fillchar(b,sizeof(b),0);
    for i:=0 to a[-1] do
      for j:=0 to a[-1] do begin
        k:=i+j;
        inc(b[k],a[i]*a[j]);
        inc(b[k+1],b[k] div base);
        b[k]:=b[k] mod base;
      end;
    b[-1]:=a[-1]*2;if b[b[-1]+1]>0 then inc(b[-1]);
  end;
procedure mul(var a:bignum);
  var
    i:word;
  begin
    for i:=0 to a[-1] do
      a[i]:=a[i]*m;
    for i:=0 to a[-1] do begin
      inc(a[i+1],a[i] div base);
      a[i]:=a[i] mod base;
    end;
    if a[a[-1]+1]>0 then inc(a[-1]);
  end;
procedure calpower(p:word;var a,b:bignum);
  begin
    if p=1 then begin
      a[-1]:=0;a[0]:=m
    end
    else begin
      calpower(p shr 1,b,a);
      square(b,a);
      if odd(p) then mul(a);
    end;
  end;
procedure reduce(var a:bignum);
  var
    i:word;
  begin
    dec(a[0],n-1);
    i:=0;while a[i]<0 do begin inc(a[i],base);inc(i);dec(a[i],1);end;
    while a[a[-1]]=0 do dec(a[-1]);
  end;
procedure out;
  var
    i:integer;
  begin
    write(a[a[-1]]);
    for i:=a[-1]-1 downto 0 do
      write(a[i] div 1000,a[i] div 100 mod 10,a[i] div 10 mod 10,a[i] mod 10);
  end;
begin
  repeat
    read(n);
    m:=n;calpower(n,a,b);reduce(a);out;write(' ');
    m:=n-1;calpower(n,a,b);reduce(a);out;writeln;
  until seekeof;
end.

我来回复

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