我是靠谱客的博主 傲娇太阳,最近开发中收集的这篇文章主要介绍牛客网暑期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) +
需要化解一下:
代码(补):
#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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复