1. 題目描述
1.1. Limit
Time Limit: 1000 ms
Memory Limit: 131072 kB
1.2. Problem Description
牛牛即將要參加考試,他學會了填答題卡。
可惜他豎着的答題卡填成了橫着的 : (
好奇的他想知道對於 n 道題,每道題 n 個選項的答題卡 ( n×n 的矩陣 ),滿足橫答題卡和豎答題卡圖形一致的方案數有多少種。
注:每道題只能選擇一個選項,即 n×n 的矩陣中只能塗黑 n 個空。求橫豎對稱的方案數。
1.3. Input
第一行給出 n。
1.4. Output
輸出方案數,答案對 109+7 取模
1.5. Sample Input
3
1.6. Sample Output
4
1.7. Notes
⎝⎛■□□□■□□□■⎠⎞∣∣∣∣∣⎝⎛□■□■□□□□■⎠⎞∣∣∣∣∣⎝⎛■□□□□■□■□⎠⎞∣∣∣∣∣⎝⎛□□■□■□■□□⎠⎞
1.8. Source
牛客網 NC205036 答題卡
2. 解讀
每當矩陣的維度 n 增加1時,可以分爲兩種情況計算。
如果矩陣第 n+1 行的元素座標爲 (n+1,n+1),即在矩陣的右下角時,則原先的 n×n 維矩陣可以取 f(n) 種情況。
如果矩陣第 n+1 行的元素座標爲 (n+1,x),x∈[1,n]時,則第 x 行的座標也被確定了,爲(x,n+1),其餘的 n−1 行可以取 f(n−1) 種情況。
則遞推方程爲 f(n+1)=f(n)+n×f(n−1)。
可以化爲 f(n)=f(n−1)+(n−1)×f(n−2)。
如當 n 從 2 變爲 3 時,過程如下所示。
- n=2 時,有兩種情況。
(■□□■)∣∣∣∣∣(□■■□)
- 當 n=3 且新增的元素在 (3,3) 位置時,有 f(2)=2 種情況
(■□□■)→⎝⎛■□□□■□□□■⎠⎞∣∣∣∣∣(□■■□)→⎝⎛□■□■□□□□■⎠⎞
- 當 n=3 且新增的元素在 (3,x),x∈[1,2] 位置時,有 2×f(1)=2 種情況。
⎝⎛□□■□■□■□□⎠⎞∣∣∣∣∣⎝⎛■□□□□■□■□⎠⎞
所以 f(3)=f(2)+2×f(1)=2+2=4。
3. 代碼
#include<iostream>
using namespace std;
const int mod=1e9+7;
const int N=1e5+10;
typedef long long ll;
ll n;
ll f[N];
int main() {
int i;
cin>>n;
f[1]=1; f[2]=2;
for (i=3;i<=n;i++)
f[i]=(f[i-1]+(i-1)*f[i-2]%mod)%mod;
cout<<f[n]<<endl;
return 0;
}
聯繫郵箱:[email protected]
Github:https://github.com/CurrenWong
歡迎轉載/Star/Fork,有問題歡迎通過郵箱交流。