csp 201312 4有趣的數

2021-10-09 05:09:00 字數 1294 閱讀 4572

問題描述

我們把乙個數稱為有趣的,當且僅當:

1. 它的數字只包含0, 1, 2, 3,且這四個數字都出現過至少一次。

2. 所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。

3. 最高位數字不為0。

因此,符合我們定義的最小的有趣的數是2013。除此以外,4位的有趣的數還有兩個:2031和2301。

請計算恰好有n位的有趣的數的個數。由於答案可能非常大,只需要輸出答案除以1000000007的餘數。

輸入格式

輸入只有一行,包括恰好乙個正整數n (4 ≤ n ≤ 1000)。

輸出格式

輸出只有一行,包括恰好n 位的整數中有趣的數的個數除以1000000007的餘數。樣例輸入4樣例輸出3

由於數的特殊性,0必須在1之前,2必須在3之前,最高位不能為0,很容易推斷出最高位應該是2,接著我們可以從1和3這兩個特殊的數字入手,我們可以列舉第一次出現1的位置和第一次出現3的位置,可以分為兩類,先出現1和先出現3,這兩種的所有情況一定不會重合,接著再對這些位置之前的數按照可能性進行判斷即可,即

方框裡的是可能出現的數,這樣問題就分解成了找出每個方框裡的可能情況然後再通過計算即可,因為每個方框裡只有兩個數的可能,於是問題變成了在k個位置上,兩個數字的排列,答案很明顯是2的k次方,但是資料可能過大,要模上題解給的數,於是我用了設計了乙個函式求解,可以不超範圍。

最後要注意按照上述方法的求解,2,3,1都會出現,只有0可能會不出現,所以要注意捨去0不出現的情況。

#include

#include

#include

#include

using

namespace std;

const

long

long mo =

1000000007

;long

long much[

1005];

long

long ans =0;

void

getmuch()

}int

main()

//先3後1

for(

int i =

2;i)for

(int j = i+

1;j<=n;j++)

cout<

}

CSP 2013 12 4 有趣的數

問題分析 這是乙個計算問題,關鍵在於找到乙個遞推式。只要找到乙個遞推式,問題就解決了。有時候這類問題也用dp 動態規劃 來解決。根據題意,有趣的數滿足以下約束條件如下 1.只包含數字0 1 2和3 2.0 1 2和3各自至少出現一次 3.所有的0都出現在1之前 4.所有的2都出現在3之前 5.最高位...

CSP 201312 4 有趣的數

我們把乙個數稱為有趣的,當且僅當 1.它的數字只包含0,1,2,3,且這四個數字都出現過至少一次。2.所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。3.最高位數字不為0。因此,符合我們定義的最小的有趣的數是2013。除此以外,4位的有趣的數還有兩個 2031和2301。請計算恰好有n...

CSP201312 4 有趣的數(數字DP)

problem 問題描述 試題編號 201312 4 試題名稱 有趣的數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 我們把乙個數稱為有趣的,當且僅當 1.它的數字只包含0,1,2,3,且這四個數字都出現過至少一次。2.所有的0都出現在所有的1之前,而所有的2都出現在所有的3...