nkoj 1896 多公尺諾
時間限制 : 10000 ms 空間限制 : 65536 kb
問題描述
用2x1的多公尺諾骨牌填滿乙個4xn(1 ≤ n ≤ 10^9) 的棋盤,總共有多少總方案。
結果可能很大,輸出mod m((0 < m ≤ 10^5)的值。
輸入格式
一行,兩個整數n 和 m
輸出格式
一行,乙個整數表示結果。
樣例輸入
樣例輸入1:
3 10000
樣例輸入2:
5 10000
樣例輸出
樣例輸出1:
11 樣例輸出2:
95思路:
設狀態f[i]表示當n=i時的方案數,t[i]表示n=i時,不能拆成其他組合的方案數。
畫圖發現,t1=1,t2=5,t3=2,t4=3….即i>2時ti=i&1?2:3;
所以f[n]=sum(f[n-i]*t[i])+t[n] (i=1、2、3…..n-1)
令f[0]=0,則f[n]=sum(f[n-i]*t[i]) (i=1、2、3……n)
把特殊的ti分出來並分類討論:
當n為奇數時,
f[n]=f[n-1]+4*f[n-2]+2 * (f[n-3]+f[n-5]+….+f[0])+3 *(f[n-4]+f[n-3]+….f[1]);
f[n+1]=f[n]+4*f[n-1]+2 * (f[n-2]+f[n-4]+….f[1])+3 *(f[n-3]+f[n-2]+….f[0]);
設p=f[n-3]+f[n-5]+….+f[0]; q=f[n-4]+f[n-3]+….f[1];
則 f[n]=f[n-1]+4*f[n-2]+2 * p+3 * q;
f[n+1]=f[n]+4*f[n-1]+2 * (p+f[n-2])+3 * p;
當n為偶數時,
f[n]=f[n-1]+4*f[n-2]+2 * (f[n-3]+f[n-5]+….+f[1])+3 *(f[n-4]+f[n-3]+….f[0]);
f[n+1]=f[n]+4*f[n-1]+2 * (f[n-2]+f[n-4]+….f[0])+3 *(f[n-3]+f[n-2]+….f[1]);
設p=f[n-3]+f[n-5]+….+f[1]; q=f[n-4]+f[n-3]+….f[0];
則 f[n]=f[n-1]+4*f[n-2]+2 * p+3 * q;
f[n+1]=f[n]+4*f[n-1]+2 * (p+f[n-2])+3 * p;
發現無論n為偶數或奇數,轉移方程都一樣…
所以構造f=* a=f`=
所以,a長:
1 1 0 0
4 0 1 0
2 0 0 1
3 0 1 0
**:
#include
#include
#include
using namespace std;
#define ll long long
const int need=5;
typedef int
int_[need][need];
int n,m,f[5];
int_ a=,,,,},ans,c;
void matrix_multi(int
_ a,int
_ b)
void matrix_power(int b)
}int main()
matrix_power(n-4);
int cnt=ans[1][1]*f[4]%m;
cnt=(cnt+ans[2][1]*f[3])%m;
cnt=(cnt+ans[3][1]*(f[2]+1))%m;
cnt=(cnt+ans[4][1])%m;
printf("%d",cnt);
}
題 矩陣乘法 NKOJ 3711 擺花
nkoj 3711 擺花 時間限制 ms 空間限制 65536 kb 評測說明 時限1000ms 問題描述 藝術館門前將擺出許多花,一共有n個位置排成一排,每個位置可以擺花也可以不擺花。有些花如果擺在相鄰的位置 隔著乙個空的位置不算相鄰 就不好看了。假定每種花數量無限,求擺花的方案數。輸入格式輸出格...
NKOJ 4385 簡單計算(矩陣乘法)
問題描述 給你三個整數 n,x,和 m,計算 n k 1k xxk 輸入格式 一行,三個整數n,x,和 m,輸出格式 一行,乙個整數,表示計算結果 樣例輸入 1 100 1 10000 樣例輸出 1 樣例輸入 2 3 4 1000 樣例輸出 2 提示 1 n,m 2 10 9 1 x 50.注意到x...
挑戰題9 矩陣乘法
9 矩陣乘法 問題描述 給定乙個n階矩陣a,輸出a的m次冪 m是非負整數 例如 a 1 23 4 a的2次冪 7 10 15 22 輸入說明 第一行是乙個正整數n m 1 n 30,0 m 5 表示矩陣a的階數和要求的冪數 接下來n行,每行n個絕對值不超過10的非負整數,描述矩陣a的值 輸出說明 輸...