シーケンスは3で割り切れます
タイトル説明
あなたは長さ50の数値文字列を与えるために、あなたはデジタルのシーケンスが割り切れるかもしれどのように多くのサブ尋ねる
の答えを法1E9 + 7
説明を入力します。
50未満の長さに等しい数からなる文字列を入力し
出力説明:
整数出力
例1
エントリー
132
輸出
3
例2
エントリー
9
輸出
1
トピックリンク:
LENが提供され、各追加番号、シーケンスは2 * LEN + 1となり最初の数値文字列の各列の最初の数から続くと考えてもよい、この質問について考えて書き込むことができます。
提供DP [0]、DP [1]、DP [2]、3が得られた余りが0,1,2である意味します。アレイ全体の更新の各追加数。
余りが0:DP [0] = DP [0] + DP [0] +1。
DP [1] = DP [1] + DP [1]。
DP [2] = DP [2] + DP [2]。
残りは1:DP [0] = DP [0] + DP [2]。
DP [1] DP [1] + DPを= [0] +1。
DP [2] = DP [2] + DP [1]。
残りは2:DP [0] = DP [0] + DP [1]。
DP [1] = DP [1] + DP [2]。
DP [2] DP [2] + DPを= [0] +1。
何がいくつかの数字の対策を見つけるために、独自の法則
ACコード
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <fstreamの> 4の#include <アルゴリズム> 5の#include <cmath> 6の#include <両端キュー> 7の#include <ベクトル> 8の#include <キュー> 9# <含む文字列 > 10の#include <CStringの> 11の#include <地図> 12の#include <積層> 13の#include < 設定 > 14 使用 名前空間STDを、 15 CONST INTモッド= 1E9 + 7 。 チャー CH [ 1000年]; 17 INT DP [ 3 ]; 18は、 INT F(チャー S)// 文字列整数変換 19。 { 20 戻り S- ' 0 ' ; 21である } 22である INT (メイン) 23である { 24 (cin.getline CH、1000年)、 25 のmemset(DP、0、はsizeof (DP))、 26は 27 INT LEN =のSTRLEN(CH); 28 用(INT= I 0、IがLEN <; Iは++)// の最初の数からトラバース 29 { 30 / * 31 ここでの焦点は、このステップは免れるべきではなく、数がオープンでなければならないサイズのDPを変更することが一時的にできない保存新しい 32 等S0、S1、S2全て完了それを置き換えるために、または結果に影響を与える後に更新、 33が 想定余りが2:[1]; DP [0] DP [0] + DP = 34である [1] DPのDP = [を1] + DP [2]; 35 DP [2] DP = [2] + DP [0]を+1しました; 36 この後、このような更新の問題がある場合、DP [0]変化、DP [2] = DP [ 2] + DP [0]を+1しました; 37 [ 使用が新しいDP [0]、ない答えに準拠し 38である * / 39 INT S0 = 0、S1 = 0、S2 = 0 ; 40 int型 X =F(CH [I])。 41 場合(Xの%3 == 0 ) 42 { 43 S0 + = DP [ 0 ] + 1 。 44の S1 + = DP [ 1 ]。 45の S2 + = DP [ 2 ]。 46 } 47 であれば(X%3 == 1 ) 48 { 49 S0 + = DP [ 2 ]。 50の S1 + = DP [ 0 ] + 1 。 51 S2 + = DP [ 1]; 52である } 53が IF(X%3 == 2 ) 54は 、{ 55 S0 + = DPが[ 1 ]; 56は S1 + = DPは、[ 2 ]、 57は + = DP [S2 0 ] + 。1 ; 58 } 59 // 均一更新 60 DP [ 0 ] + = S0; 61である [DP 1 ] + = S1; 62は DP [ 2 ] + = S2; 63である ため(INT J = 0 ; J < 3。、J ++)// 各時間モジュロ1E9 + 7; 64 DP [J] DP = [J]%モジュレーション; 65 } 66 COUT << DP [ 0 ] << ENDL; 67 }