链接:https://ac.nowcoder.com/acm/contest/5389/C
来源:牛客网
题目描述
牛牛即将要参加考试,他学会了填答题卡。
可惜他竖着的答题卡填成了横着的 : (
可惜他竖着的答题卡填成了横着的 : (
好奇的他想知道对于 n 道题,每道题 n 个选项的答题卡 ( n * n 的矩阵 ),满足横答题卡和竖答题卡图形一致的方案数有多少种。
注:每道题只能选择一个选项,即 n * n 的矩阵中只能涂黑 n 个空。求横竖对称的方案数。
题解如下:
显然n维矩阵是关于主对角线对称的,那么我们先固定左上角,矩阵剩下了(n-1)维矩阵,满足(n-1)维矩阵对称即可,然后选取第二行第一列、第三行第一列....、第n行第一列,根据对称原则,我们也要选取相应的第一行第二列、第一行第二列、....、第一行第n列,剩下(n-2)维矩阵,也使它对称,一共有(n-1)种情况。
故规律是dp[n] = dp[n-1]+(n-1)*dp[n-2]
code:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int NMAX = 1e5 + 10; const int MOD = 1e9+7; ll a[NMAX]; int main() { int n; scanf("%d",&n); a[1] = 1;a[2] = 2;a[3] = 4; for(register int i = 4;i <= n;i++) a[i] = (a[i-1]+(i-1)*a[i-2]%MOD)%MOD; printf("%lld ",a[n]); return 0; }