1. 程式人生 > >【題解】老虎的數字遊戲

【題解】老虎的數字遊戲

img 輸入格式 滿足 小學 重復 ide efi one open

題目描述

  飛鏢遊戲雖好玩,但小老虎不忘考考同學的數學能力,為了好玩和不大難,小老虎想就用5個阿拉伯數吧。1、2、3、4、5數字組成一個N位的數(可以重復使用,也可以不用),有多少個數I,滿足Imod3=1。

輸入格式

  一行,為1個整數N。

輸出格式

  一個數,即滿足要求的數的個數mod100007。

輸入樣例

4

輸出樣例

208

數據規模

  對於30%的數據,N≤8;

  對於100%的數據,N≤1000000。

題解

  相信大家小學都學過。一個數$mod 3$等於這個數的各位數字之和$mod 3$。

  假設我們已經得到了一個$i$位的滿足題目要求的數,這個時候,我們在$i+1$為添加$3$,一定還能滿足題目要求。

  但是,如果不添加$3$呢?

  這裏我們可以列舉出來:

  (1)當第$i$位為$1$時,我們可以改成$[2,2],[2,5],[3,1],[3,4],[5,2],[5,5]$(這裏$[x,y]$表示第$i$位改成$x$,第$i+1$位添上$y$,下同)。共$6$種情況。

  (2)當第$i$位為$2$時,我們可以改成$[1,1],[1,4],[3,2],[3,5],[4,1],[4,4]$。共$6$種情況。

  (3)當第$i$位為$3$時,我們可以改成$[1,2],[1,5],[2,1],[2,4],[4,2],[4,5],[5,1],[5,4]$。共$8$種情況。

  (4)當第$i$位為$4$時,我們可以改成$[2,2],[2,5],[3,1],[3,4],[5,2],[5,5]$。共$6$種情況。

  (5)當第$i$位為$5$時,我們可以改成$[1,1],[1,4],[3,2],[3,5],[4,1],[4,4]$。共$6$種情況。

  觀察(1)(2)與(4)(5)其實是一樣的,那我們將數量除以$2$即可。

  我們可以設$c[i][0]$為第$i$位為$3$的符合題目要求的數量,$c[i][1]$為第$i$位不為$3$的符合題目要求的數量。

  根據上面的方程可得,$c[i][0] = c[i - 1][0] + c[i - 1][1], c[i][1] = c[i - 1][0] \times 8 + c[i - 1][1] \times 3$。這裏可以用滾動數組優化。

技術分享圖片
#include <iostream>
#define
MOD 100007 using namespace std; int n; int prev[2], now[2]; //最高位為3或不為3的符合條件的情況 int main() { cin >> n; now[1] = 2; while(--n) { prev[0] = now[0]; prev[1] = now[1]; now[0] = (prev[0] + prev[1]) % MOD; now[1] = (prev[0] * 8 + prev[1] * 3) % MOD; } cout << (now[0] + now[1]) % MOD;
參考程序

【題解】老虎的數字遊戲