我是靠谱客的博主 傲娇太阳,最近开发中收集的这篇文章主要介绍牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix [数学]                                          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("%lldn", (f+m)%m);
    }
    return 0;
}

写的是真的辛苦啊!!!

最后

以上就是傲娇太阳为你收集整理的牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix [数学]                                          B Symmetric Matrix的全部内容,希望文章能够帮你解决牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix [数学]                                          B Symmetric Matrix所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(139)

评论列表共有 0 条评论

立即
投稿
返回
顶部