問題描述
我們把乙個數稱為有趣的,當且僅當:
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中的乙個唄是吧?你放1看看行不,肯定不行啊,所有0得在1的前面,你放1了讓0情何以堪?放2可以,放3的話你讓2情何以堪?
所以首位只能放2對吧?
現在來說status這個二維陣列,status[i][j]到第i個位置滿足第j種狀態的所有可能數,總共最多有6種狀態:
之後要新增元素,是加在最後乙個。
0 -- 0 1 (2) 3
1 -- (0) 1 (2) 3
2 -- 0 1 (2) (3)
3 -- (0) (1) (2) 3
4 -- (0) 1 (2) (3)
5 -- (0) (1) (2) (3)
比如說status[5][4] = 70的意思就是,到第5位(首位是第1位!)為止,保持第4種狀態的數一共有70個(咳咳,當然資料是我瞎掰的)
在括號裡的數說明前面的k位中,只出現了括號裡的數,你可以發現6個狀態中2都是被括號括起來的,沒辦法,剛剛說了2必須是首位啊
而且這是你在填第k+1位的時候能保持的僅有的6個狀態,其他的狀態都是無效的
比如0(1)(2) 3就是無效的,那是不可能的啊,假如說你現在填的是第k位吧,那麼你填完第k位的數後的狀態是只包括1和2,那你想想,怎麼可能只出現1和2呢?那你讓0情何以堪?0就沒地方放了。
第乙個for迴圈不講
第二個for迴圈n次だろ?很明顯這個就對應n位
然後看第乙個式子
status[i][0] = 1;
到第i位為止,第i位填的數字使整個數字要滿足狀態0,那麼這樣的可能有幾個?1個唄,你要能填出2以外的數來我就去(qia shi la)
status[i][1] = (status[i - 1][1] * 2 + status[i - 1][0]) % mod;
到第i位為止,填第i位的數,使整個數保持狀態1。要滿足狀態1,也就是只出現0和2,那你想前i-1位應該是個什麼狀態,要麼是只有2,要麼是0,2對吧?就兩種狀態
然後如果前i-1位是狀態0的話(只有2),那你這一位只能填0了嘛,所以status[i - 1][0]就是這樣來的,如果前i-1位是狀態1(有0,2),那麼你現在有兩種選擇,填0或者是2兩種情況,status[i - 1][1] * 2就是這樣來的,然後把兩種情況相加,就表示到第i位為止,狀態為1的數共有status[i][1]這麼多個
然後後面的都差不多啦,因為每一位可能會進入6種不同的狀態,所以都要算出來
最後輸出system.out.println(status[number][5]),因為題目要求0,1,2,3必須至少出現一次,所有我們要輸出狀態5的數的個數
每次都求餘,這個很好理解吧?因為題目只要求求餘數就可以了呀,中間結果不斷取餘不會有影響的
採用數字dp求解,到某乙個階段的各個狀態遞推。
#include #include #include #include #include #include #includeusing namespace std;
#define mod 1000000007
int main(void)
{ int n;
cin>>n;
long long dp[n+1][6];
memset(dp,0,sizeof(dp));
for (int i=1;i
ccf有趣的數
有趣的數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 我們把乙個數稱為有趣的,當且僅當 1.它的數字只包含0,1,2,3,且這四個數字都出現過至少一次。2.所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。3.最高位數字不為0。因此,符合我們定義的最小的有趣的數是...
CCF(有趣的數)
問題描述 試題編號 201312 4 試題名稱 有趣的數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 我們把乙個數稱為有趣的,當且僅當 1.它的數字只包含0,1,2,3,且這四個數字都出現過至少一次。2.所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。3.最高位...
CCF 有趣的數
問題描述 我們把乙個數稱為有趣的,當且僅當 1.它的數字只包含0,1,2,3,且這四個數字都出現過至少一次。2.所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。3.最高位數字不為0。因此,符合我們定義的最小的有趣的數是2013。除此以外,4位的有趣的數還有兩個 2031和2301。請計...