答题卡

链接: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\n",a[n]);
    return 0;
}
View Code

 

posted @ 2020-05-02 09:46  jadelemon  阅读(235)  评论(0编辑  收藏  举报