21天好习惯第一期-8【每日一题】Symmetric Matrix

【每日一题】Symmetric Matrix
Symmetric Matrix
题目描述:
计算一个满足下列条件的,n x n的矩阵的数量(答案对mod取余)
在这里插入图片描述
输入描述:
多组输入,每行输入两个整数,n和mod

1 ≤ n ≤ 105
1 ≤ mod ≤ 109
The sum of n does not exceed 107.
输出描述:
输出一个整数表示结果
简单回顾邻接矩阵

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:

了解了数据结构的邻接矩阵后再看这个矩阵满足的条件,矩阵对称和a_{ii}a
ii

=0 可以让我们联想到无向图的邻接矩阵,a_{ii}a
ii

=0表示没有自环。而如果边权表示边数的话,每一行的和为2,说明每个点的度为2。显然是由若干个简单环组成的(简单环就是没有公共点公共边的环),环中元素个数至少是2(没有自环)。
既然我们已经发现了规律,接下来可以来递推了:
1.我们考虑用f[i]表示由n个点组成若干个简单环的方法数。
2.f[1]=1,f[2]=f[3]=1f[1]=1,f[2]=f[3]=1 。
当n>3,由f[n-1]f[n−1] 推f[n]f[n] :
3.加入第n个点并且取n-1个点中的任何一个点形成2元环,n-1个方案,此时还有n-2个元素,方式总数为(n-1)fn-2f[n−2] 。
4.加入第n个点并和前取n-1个点中的任意k-1个点形成k(k>=3)(k>=3) 元环,C_{n-1}^{k-1}C
n−1
k−1

种方案。此时还有n-k个元素,f[n-k]f[n−k] 种方案。将取出的k个点全排列,k!k! 种情况,因为1234和2341和3412是一样的,所以可以确定某一位,然后还剩下k-1个点不确定,所以应该是(k-1)!(k−1)! 种情况。因为是无向图,还要排除首尾一致的情况(即除于2),所以方案数为:图片说明 。
5.由3、4可以得到总的方案数为:在这里插入图片描述

图片说明 。
6.化简已经讲的很清楚了:
图片说明
在这里插入图片描述

7.写代码的时候注意不要把’-’


在这里插入图片描述

后面的(n-1)(n−1) 给提出来,不然会wa,因为后面要除2,提出(n-1)(n−1)会丢失精度。

#include <iostream>
#define js ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
ll f[maxn],n,mod;
int main() {
    js;
    f[1] = 0; f[2] = f[3] = 1;
    while(cin>>n>>mod) {
        for(ll i=4;i<=n;++i)
            f[i] = ((i - 1) * (f[i - 1] + f[i - 2]) - (i - 1) * (i - 2) / 2 * f[i - 3]) % mod;
        cout<<(f[n]+mod)%mod<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值