[FJOI2007]轮状病毒

Time Limit: 1 Sec  Memory Limit: 162 MB
Description

[FJOI2007]轮状病毒 给定n(N<=100),编程计算有多少个不同的n轮状病毒。

Input

第一行有1个正整数n。

Output

将编程计算出的不同的n轮状病毒数输出

Sample Input

3

Sample Output

16
找规律题+高精。水题其实。规律见http://hi.baidu.com/oichampion/blog/item/e6d9885cde79a290810a1853.html
错误:在做高精乘的时候把y=0放在两重循环之外了。。。
 
 
AC CODE
 
program hy_1002;
type ty= array [ 0..100 ] of longint ;
var a: array [ 1..100 ] of ty;
     n,i: longint ;
     b:ty;
//============================================================================
function cheng(k: longint ):ty;
var x,y,i: longint ;
begin
   y:= 0 ; fillchar(cheng,sizeof(cheng), 0 );
   for i:= 1 to a[k][ 0 ] do
   begin
     x:= 3 *a[k][i]+y;
     cheng[i]:=x mod 10 ; y:=x div 10 ;
   end ; cheng[ 0 ]:=a[k][ 0 ];
   if y> 0 then
   begin
     inc(cheng[ 0 ]);
     cheng[cheng[ 0 ]]:=y;
   end ;
end ;
//============================================================================
function jian(a,b:ty):ty;
var x,i: longint ;
begin
   fillchar(jian,sizeof(jian), 0 );
   for i:= 1 to a[ 0 ] do
   begin
     x:=a[i]-b[i];
     if x< 0 then
     begin
       jian[i]:=x+ 10 ;
       dec(a[i+ 1 ]);
     end else jian[i]:=x;
   end ; jian[ 0 ]:=a[ 0 ];
   if a[a[ 0 ]]= 0 then dec(jian[ 0 ]);
end ;
//============================================================================
function multi(k: longint ; p: boolean ):ty;
var x,y,i,j: longint ;
begin
   fillchar(multi,sizeof(multi), 0 );
   for i:= 1 to a[k][ 0 ] do
   begin
     y:= 0           //每一次都要赋为0!
     for j:= 1 to a[k][ 0 ] do
     begin
       x:=multi[i+j- 1 ]+a[k][i]*a[k][j]+y;
       multi[i+j- 1 ]:=x mod 10 ; y:=x div 10 ;
     end ;
     if y> 0 then multi[i+j]:=y;
   end ; multi[ 0 ]:=a[k][ 0 ]* 2 - 1 ;
   if y> 0 then
   begin
     inc(multi[ 0 ]);
     multi[multi[ 0 ]]:=y;
   end ;
   y:= 0 ;
   if p then
   for i:= 1 to multi[ 0 ] do
   begin
     x:=multi[i]* 5 +y;
     multi[i]:=x mod 10 ; y:=x div 10 ;
   end ;
   if y> 0 then
   begin
     inc(multi[ 0 ]);
     multi[multi[ 0 ]]:=y;
   end ;
end ;
//============================================================================
begin
   readln(n);
   a[ 1 ][ 1 ]:= 1 ;
   if n mod 2 = 1 then a[ 2 ][ 1 ]:= 4 else a[ 2 ][ 1 ]:= 3 ;
   a[ 1 ][ 0 ]:= 1 ; a[ 2 ][ 0 ]:= 1 ;
   for i:= 3 to (n+ 1 ) div 2 do
   begin
     b:=cheng(i- 1 ); a[i]:=jian(b,a[i- 2 ]);
   end ;
   b:=multi((n+ 1 ) div 2 , not (odd(n)));
   for i:=b[ 0 ] downto 1 do write (b[i]);
   writeln ;
end .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值