牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix [数学]

                                          B Symmetric Matrix

题目:计算满足题目的n*n的矩阵的数量,题目给出的条件,应该能可以看出是一个对称矩阵,类似一个图邻接矩阵;

这样子就应该想成是一个无向图,a[i][1] + a[i][2] + a[i][3] + ...... + a[i][n] = 2;意思就是这个图就是一堆环;

那么n - 1个节点,这里新加入一个节点;

特殊情况:从n-1个旧节点中选一个节点与新节点连边,剩下的n-2个旧节点单独连边,方案数就是(n-1)*f(n-2);

推广到一般情况:剩下k(k < n - 2)个旧节点自己单独连边那么就是C(n-1, k),剩下的n-k-1个旧节点跟新节点连边是(n-k-1)!/2;

这个(n-k-1)!/2的数量,想一想就很显然啦,自己花几个节点就能明白;

这样子就是f(n) = (n-1)*f(n - 2) + \sum_{k = 2}^{n - 3} (n-1)!*f(k)/(2*(k!)) 

需要化解一下:

代码(补):

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5+7;

int n;
ll m, a, b, f; //f[0], f[1], f[2/n];

int main()
{
    while(~scanf("%d%lld", &n, &m))
    {
        a = 1ll, b = 0ll, f = 1ll;
        for(int i = 3; i <= n; i++)
        {
            ll temp = f;
            f = ((1ll-i)*(i-2ll)/2ll%m*a%m + (i - 1ll)*(b+f)%m + m)%m;
            a = b; b = temp;
        }
        if(n == 1) f = 0ll;
        printf("%lld\n", (f+m)%m);
    }
    return 0;
}

写的是真的辛苦啊!!!

猜你喜欢

转载自blog.csdn.net/weixin_39792252/article/details/81221867
今日推荐