bzoj1867: [Noi1999]钉子和小球

来源:互联网 发布:latex mac官方下载 编辑:程序博客网 时间:2024/05/16 07:45

传送门
大力dp
首先的到状态:
小球落在第i行第j个钉子上的概率。
然后得到转移:
f[i+2][j+1]+=f[i][j](i,j没钉子)
f[i+1][j],f[i+1][j+1]+=f[i][j]/2(i,j有钉子)

“`
type arr=array [1..2] of int64;
var
a:array [-1..55,-1..55] of char;
f:array [-1..55,-1..55] of arr;
p:arr;
n,m,i,j:longint;
function gcd(x,y:int64):int64;
begin if (y=0) then exit(x) else exit(gcd(y,x mod y)); end;
procedure jia(var a:arr; b:arr);
var zi,mu,p:int64;
begin
p:=gcd(a[2],b[2]);
mu:=b[2]*(a[2] div p);
zi:=b[1](a[2] div p)+a[1](b[2] div p);
if (zi=0) then begin a[1]:=0; a[2]:=1; exit; end;
p:=gcd(mu,zi);
a[1]:=zi div p;
a[2]:=mu div p;
end;
begin
read(n,m);
for i:=0 to n-1 do
for j:=0 to i do begin
read(a[i,j]);
while (a[i,j]<>’*’) and (a[i,j]<>’.’) do read(a[i,j]);
end;
for i:=0 to n do
for j:=0 to i do f[i,j,2]:=1;
f[0,0,1]:=1;
for i:=0 to n-1 do
for j:=0 to i do
if a[i,j]=’*’ then begin
p:=f[i,j];
if p[1] mod 2=0 then p[1]:=p[1] div 2 else p[2]:=p[2]*2;
jia(f[i+1,j],p); jia(f[i+1,j+1],p);
end
else jia(f[i+2,j+1],f[i,j]);
write(f[n,m,1],’/’,f[n,m,2]);
end.

原创粉丝点击