HDU 5459イエスはここにあります

 

再帰的な問題

このタイトルは私にとって良い......難しい法律を見つけるために感じているか、ゆっくりとそれについて考えます

题意:S1 = C、S2 = FF、S3 = CFF、... S [I] = sの[I - 2] + S [I - 1]

   S5で開始する(S5 =  cffffcff)、5で分離された2つのCFF、出力5が存在しました

   S6 = ffcffcffffcff、出力と全てCFFとの間の距離、3 + 5 + 8 = 16

   、iは<S [I] = 201314、出力ANS [I]

考える:見つかったいくつかのクラスフィボナッチ数、文字列s [i]は= Sを[I - 2] [私は - 1]質問+ Sの意味は、文字列の長さがlen [i]を= LEN [I - 1] + lenの[I - 2]、C列NUMの数[I] = NUM​​ [I - 1] + NUM [I - 2]。

   その後、位置及び文字列cを記録する必要があり、最初の文字の位置は、和[I] =和は1であり、[I - 1] +和[I - 2] + LEN [I - 2] * NUM [ N - 1]。

   ANSについては、それは考えることができ、ANS [I] =アンスは、[I - 1] + ANS [I - 2] +?

   ?iは - 1とI - CFF及び図2に示すように、第一オペレータとの間の距離I - 1個のCに対するすべてのI - シリーズ2の第1列から、両方numは[I - 1] * lenは[I - 2] +和[I - 1] ............式

   そこ2 NUM - [ - 2 i]は、両方NUM [I - 1] * lenは[I - 2] * NUM [I - 2] + NUM [I - 2] Cは、NUMによって必要とされるタイプであり、Iため[I - 2] *和[I - 1] ...... 2式

   実際私 - C 1だけ動きIにおける - 位置2、次に二項減算和にC [N - 2] * NUM [N - 1]

   化简可得ANS [I] =のANSは、[I - 1] + ANS [I - 2] +(LEN [I - 2] * NUM [I - 2] - 和[I - 2])* NUM [I - 1] +和[I - 1] * NUM [I - 2]

   そして、長い長いオープンする必要があり、これらの4つの配列に注意を払う、または各1つの取るために、剰余をオーバーフローします。

コード:

1の#include <iostreamの>
 2の#include <cstdioを>
 3  
4  使用して 名前空間STDを、
5  
6  のconst  int型 N = 201314 + 1 7  のconst  int型 MOD = 530600414 8 typedefの長い 長いLL。
9  
10  のLL LEN [N]、NUM [N]、合計[N]、ANS [N]。
11  
12  のint main()の
 13  {
 14      のint T、N。
15  
16      CIN >> T。
17の      LEN [0 ] = 1、LENが[ 1 ] = 2、LENは[ 2 ] = 3、lenが[ 3 ] = 5、レン[ 4 ] = 8、レン[ 5 ] = 13 18      かどうか[ 0 ] = 1かどうか、[ 1 ] = 0かどうか、[ 2 ] = 1かどうか、[ 3 ] = 1かどうか、[ 4 ] = 2、か[ 5 ] = 3 ;
19      午前[ 0] = 1、和[ 1 ] = 0、和[ 2 ] = 1〔、合計3 ] = 3、和[ 4 ] = 7、合計が[ 5 ] = 20 20の      ANS [ 4 ] = 5、ANS [ 5 ] = 16 21      のためには、int型 I = 5、iがN < - 1 ; iは++ ){
 22          LEN [I + 1 ] =(LEN [I] + LEN [I- 1 ])%MOD。
23         確実[I + 1 ] =(NUM [I] + NUM [I- 1 ])%MOD。
24          AM [I + 1 ] =(I [I] + I [I- 1 ] + LEN [I- 1 ] * NUM [I])%MOD。
25の          ANS [I + 1 ] =(ANS [I] + ANS [I- 1 ] +(((LEN [I- 1 ] * NUMは[I- 1 ] - I [I- 1 ])MOD%)* NUM [ I])MOD%+(I [I] * NUM [I- 1 ])MOD%)%MOD。
26  
27      }
 28      のintフラグ= 0 29      一方、(I - ){
 30         フラグ++ ;
31          のscanf(" %d個"、&N)
32          のprintf(" ケース#1%のD:" 、フラグ);
33          のprintf(" %d個の\ n "、ANS [N- 1 ])。
34      }
 35      リターン 0 36 }
コードの表示

考えて再び一緒に入れて書かれた説明(

より明確に感じ

 

おすすめ

転載: www.cnblogs.com/moomight/p/11426463.html