CCF 2013から4、興味深い数

興味深いことに、数

問題の意味

:とする場合にのみあれば我々は、興味深いの数と呼ば
  1.それは数字0、1、2、3のみ含まれており、これらの4つの数字が一度少なくとも登場しています。
  2.すべての0は1、2の全ての前に表示され、すべての3つのすべての前に表示されます。
  3.最上位桁はゼロではありません。
  したがって、興味深いの最小数は、2013年の私たちの定義に沿ったものです。2031年および2301:また、興味深い数4は、2つあります。
  正確にnビットの興味深い数の数を計算してください。答えは非常に大きくなる可能性があるため、唯一の答えは十億七の出力で割って必要があります。

入力形式

ちょうど正の整数N(4≤N≤1000)を含む唯一のライン入力、 。
出力フォーマットの
  出力数は、ちょうどn十億七の残りの部分で割っ面白いビット整数を含む唯一のラインです。

サンプル入力

4

サンプル出力

3

問題の解決策

動的プログラミング、デジタルのDP
次に質問の意味は、0と2のそれぞれ正面および13、0及び2は、このように最初に考慮し、現在の状態遷移図1および図3を検討する、最初の場所は0であることができないので、その一つだけ桁の場所を想定し、したがって、唯一のケース全体2;仮定は最初のケースでは、2つの数値を置くことができ、及び2,2及び3 0共存共存を含んでいてもよい、0を入れていないので、2が共存した場合はできません。前提とすることができます基づいて3つの数字を入れて、それが2,0,1、または0,2を置くことができ、同様の仮定は、4つの数字、0、1、端部を置くことができます。6つの状態の合計:

  1. 全2
  2. 0置き、2
  3. 2入れて3
  4. 0,1,2を入れて
  5. 0,2を入れて
  6. 0,1,2,3プット

状態遷移:
最初の状態は初期状態であり、状態1 - > 2状態;状態1 - >状態3、状態2 - >状態4と状態4+状態5>ステータス; 3-> 5状態2+状態ステータス6

ステータスの1->状態2、状態1 - >状態3:理解しやすいです

ff[i][1]=(ff[j][0]+ff[j][1]*2)%mod;
ff[i][2]=(ff[j][0]+ff[j][2])%mod;

状態2 - >状態4:二つの状態1及び2放電前場合に考慮すべき放電必要の放電現在位置:FF [J] [1] + FF [J] [3] 2が置かれているFF [J] [3]

ff[i][3]=(ff[j][1]+ff[j][3]*2)%mod;

ステータスステータス2+、3-> 5状態、状態4+状態5> 6ステータス:だけ入れて考えると、とプット分析類似した以前の状態遷移。

ff[i][4]=(ff[j][1]+ff[j][2]+ff[j][4]*2)%mod;
ff[i][5]=(ff[j][3]+ff[j][4]+ff[j][5]*2)%mod;

コード:

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false)
#define maxn 1005
#define mod 1000000007

long long ff[maxn][6];

int main()
{
    IOS;
    int n;
    cin>>n;

    for(int i=1;i<=n;i++)
    {
        int j=i-1;
        ff[i][0]=1;
        ff[i][1]=(ff[j][0]+ff[j][1]*2)%mod;
        ff[i][2]=(ff[j][0]+ff[j][2])%mod;
        ff[i][3]=(ff[j][1]+ff[j][3]*2)%mod;
        ff[i][4]=(ff[j][1]+ff[j][2]+ff[j][4]*2)%mod;
        ff[i][5]=(ff[j][3]+ff[j][4]+ff[j][5]*2)%mod;
    }

    cout<<ff[n][5];
    return 0;
}

公開された41元の記事 ウォンの賞賛2 ビュー1224

おすすめ

転載: blog.csdn.net/qq_41418281/article/details/103965686