Description
轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示
N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示
现给定n(N<=100),编程计算有多少个不同的n轮状病毒
Input
第一行有1个正整数n
Output
计算出的不同的n轮状病毒数输出
Sample Input
3
Sample Output
16
题解:
手推DP转移方式,推了好久依旧特别长。
不明白为什么他们的公式这么短。
代码:
var
i,j,k,l,n,m,x:longint;
a:array[..,..]of longint;
b,c:array[..]of longint;
begin
readln(n);
if n= then begin writeln(); halt; end;
if n= then
a[,]:=; a[,]:=; a[,]:=; a[,]:=;
a[,]:=; a[,]:=; a[,]:=; a[,]:=; a[,]:=;
for i:= to n- do
begin
x:=;
for j:= to a[i-,] do
begin
a[i,j]:=a[i,j]+*a[i-,j]-*a[i-,j]+*a[i-,j]-a[i-,j]+x;
while a[i,j]< do begin dec(a[i,j+]); a[i,j]:=a[i,j]+; end;
x:=a[i,j] div ;
a[i,j]:=a[i,j] mod ;
end;
while x> do begin inc(j); a[i,j]:=x mod ; x:=x div ; end;
a[i,]:=j;
end;
x:=;
for i:= to a[n-,] do
begin
a[n-,i]:=a[n-,i]*+x;
x:=a[n-,i] div ;
a[n-,i]:=a[n-,i] mod ;
end;
while x> do begin inc(i); a[n-,i]:=x mod ; x:=x div ; end;
a[n-,]:=i;
x:=;
for i:= to a[n-,] do
begin
a[n-,i]:=a[n-,i]*+x;
if i= then a[n-,i]:=a[n-,i]+;
x:=a[n-,i] div ;
a[n-,i]:=a[n-,i] mod ;
end;
while x> do begin inc(i); a[n-,i]:=x mod ; x:=x div ; end;
a[n-,]:=i;
for i:= to a[n-,] do
begin
a[n-,i]:=a[n-,i]-a[n-,i];
while a[n-,i]< do
begin
dec(a[n-,i+]); a[n-,i]:=a[n-,i]+;
end;
end;
while a[n-,a[n-,]]= do dec(a[n-,]);
for i:=a[n-,] downto do write(a[n-,i]);
writeln;
end.