不是很长
希望帮忙看看
program mouse;
var a,b:array[1..3000] of longint;
x,y,z,i,j,k,m,n,t,s:longint;
begin
read(x,y,z,n);
a[1]:=1;
b[1]:=1;
for i:=2 to n do
begin
b[i]:=b[i]+b[i-1]*x;
if i>2 then b[i]:=b[i]+b[i-2]*y;
for j:=1 to i-3 do
b[i]:=b[i]+b[j]*z;
a[i]:=a[i]+b[i]+a[i-1];
end;
write(a[n]*2);
end.
program p183;
const dn=5;
const ml=6000;
const hpbyte=10000;
var
digs:array[1..dn] of array[1..ml] of longint;
diglen:array[1..dn] of integer;
incstep:array[1..3] of integer;
inctime:integer;
k,j:integer;
zero:array[0..5] of string;
tmplen:integer;
pos:integer;
{hd section - begin}
procedure clear(i:integer);
begin
digs[i]:=digs[5];
diglen[i]:=0;
end;
procedure init();
var i:integer;
begin
for i:=1 to dn do
clear(i);
end;
procedure mov(i1,i2:integer);
begin
digs[i1]:=digs[i2];
diglen[i1]:=diglen[i2];
end;
procedure sum(i1,i2:integer);
var i,digpos:integer;
begin
tmplen:=diglen[i1];
if(diglen[i2]>tmplen)then tmplen:=diglen[i2];
for i:=1 to tmplen do
begin
digs[i1][i]:=digs[i1][i]+digs[i2][i];
end;
end;
procedure multiex();
var i,digpos:integer;
begin
tmplen:=diglen[1];
if(diglen[2]>tmplen)then tmplen:=diglen[2];
if(diglen[3]>tmplen)then tmplen:=diglen[3];
for i:=1 to tmplen do
begin
digs[4][i]:=digs[1][i]*incstep[1];
digs[4][i]:=digs[4][i]+digs[2][i]*incstep[2];
digs[4][i]:=digs[4][i]+digs[3][i]*incstep[3];
if(i>diglen[4])then
diglen[4]:=i;
end;
end;
procedure collect();
var j,k:integer;
begin
for j:=1 to 3 do
begin
tmplen:=diglen[j];
for k:=1 to tmplen do
begin
digs[j][k+1]:=digs[j][k+1]+(digs[j][k] div hpbyte);
if(digs[j][k+1]>0)then
if(k+1>diglen[j])then
diglen[j]:=k+1;
digs[j][k]:=digs[j][k] mod hpbyte;
end;
end;
end;
{hd section - end}
function fill(num:longint):string;
begin
fill:=zero[3-trunc(ln(num)/ln(10))];
end;
begin
zero[0]:=;
for k:=1 to 5 do
zero[k]:=zero[k-1]+0;
fillchar(digs[5],sizeof(digs[5]),0);
readln(incstep[1],incstep[2],incstep[3],inctime);
init();
digs[1][1]:=1;
diglen[1]:=1;
for k:=1 to inctime do
begin
multiex();
sum(3,2);
mov(2,1);
mov(1,4);
collect();
end;
sum(1,2);
sum(1,3);
collect();
pos:=0;
for k:=diglen[1] downto 1 do
begin
if((pos=0)and(digs[1][k]>0))then pos:=k;
if(pos>0)then
if(pos=k)then
write(digs[1][k])
else
write(fill(digs[1][k]),digs[1][k]);
end;
end.
我发现我看不懂你程序的意思了...
不过似乎是思路有点问题...
每天的变化应该是
temp:=小*a+中*b+老*c;
老:=中+老;
中:=小;
小:=temp;
还有 楼上 那个式子不是你写的吧……
我来解释解释
a[i]指到第i个月一共有多少只老鼠
b[i]指第i月新生出多少只老鼠
var a,b,c,n:int64;
f,s:array[-2..3000,1..600]of int64;
i,j:integer;
t:boolean;
begin
readln(a,b,c,n);
f[0,1]:=1;
s[0,1]:=1;
for i:=1 to n do
begin
for j:=1 to 599 do
begin
f[i,j]:=f[i,j]+s[i-3,j]*c;
f[i,j]:=f[i,j]+f[i-2,j]*b;
f[i,j]:=f[i,j]+f[i-1,j]*a;
if f[i,j]>=10000000000 then
begin
f[i,j+1]:=f[i,j+1]+f[i,j]div 10000000000;
f[i,j]:=f[i,j]mod 10000000000;
end;
s[i,j]:=s[i,j]+s[i-1,j]+f[i,j];
if s[i,j]>=10000000000 then
begin
s[i,j+1]:=s[i,j+1]+s[i,j]div 10000000000;
s[i,j]:=s[i,j]mod 10000000000;
end;
end;
end;
t:=false;
for i:=600 downto 1 do
begin
if(s[n,i]>0)and(not(t))then
begin
t:=true;
write(s[n,i]);
continue;
end;
if t then
begin
case s[n,i] of
0..9:write(000000000,s[n,i]);
10..99:write(00000000,s[n,i]);
100..999:write(0000000,s[n,i]);
1000..9999:write(000000,s[n,i]);
10000..99999:write(00000,s[n,i]);
100000..999999:write(0000,s[n,i]);
1000000..9999999:write(000,s[n,i]);
10000000..99999999:write(00,s[n,i]);
100000000..999999999:write(0,s[n,i]);
else write(s[n,i]);
end;
end;
end;
end.