BZOJ1002:[FJOI2007]轮状病毒
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转移方式,推了好久依旧特别长。
不明白为什么他们的公式这么短。
代码:
1 var 2 i,j,k,l,n,m,x:longint; 3 a:array[0..200,0..1000]of longint; 4 b,c:array[0..1000]of longint; 5 begin 6 readln(n); 7 if n=1 then begin writeln(1); halt; end; 8 if n=2 then 9 a[0,0]:=1; a[0,1]:=1; a[1,0]:=1; a[1,1]:=3; 10 a[2,0]:=1; a[2,1]:=8; a[3,0]:=2; a[3,1]:=1; a[3,2]:=2; 11 for i:=4 to n-1 do 12 begin 13 x:=0; 14 for j:=1 to a[i-1,0] do 15 begin 16 a[i,j]:=a[i,j]+5*a[i-1,j]-8*a[i-2,j]+5*a[i-3,j]-a[i-4,j]+x; 17 while a[i,j]<0 do begin dec(a[i,j+1]); a[i,j]:=a[i,j]+10; end; 18 x:=a[i,j] div 10; 19 a[i,j]:=a[i,j] mod 10; 20 end; 21 while x>0 do begin inc(j); a[i,j]:=x mod 10; x:=x div 10; end; 22 a[i,0]:=j; 23 end; 24 x:=0; 25 for i:=1 to a[n-1,0] do 26 begin 27 a[n-1,i]:=a[n-1,i]*3+x; 28 x:=a[n-1,i] div 10; 29 a[n-1,i]:=a[n-1,i] mod 10; 30 end; 31 while x>0 do begin inc(i); a[n-1,i]:=x mod 10; x:=x div 10; end; 32 a[n-1,0]:=i; 33 x:=0; 34 for i:=1 to a[n-2,0] do 35 begin 36 a[n-2,i]:=a[n-2,i]*2+x; 37 if i=1 then a[n-2,i]:=a[n-2,i]+2; 38 x:=a[n-2,i] div 10; 39 a[n-2,i]:=a[n-2,i] mod 10; 40 end; 41 while x>0 do begin inc(i); a[n-2,i]:=x mod 10; x:=x div 10; end; 42 a[n-2,0]:=i; 43 for i:=1 to a[n-1,0] do 44 begin 45 a[n-1,i]:=a[n-1,i]-a[n-2,i]; 46 while a[n-1,i]<0 do 47 begin 48 dec(a[n-1,i+1]); a[n-1,i]:=a[n-1,i]+10; 49 end; 50 end; 51 while a[n-1,a[n-1,0]]=0 do dec(a[n-1,0]); 52 for i:=a[n-1,0] downto 1 do write(a[n-1,i]); 53 writeln; 54 end.