Symmetric Matrix

Symmetric Matrix

https://ac.nowcoder.com/acm/problem/17134

题意:求满足以下条件的n*n矩阵的个数:
1.所有元素的值属于{0,1,2};
2.为对称矩阵;
3.每一行的值的和为2;
4对角线的值为0;
结果对m取模。

思路:我们知道无向图的邻接矩阵是对称的,所以将四个条件可以转化为找满足没有自环的n个节点且每个节点有且仅有二条边的无向图有多少个?
我们可以知道这样的无向图是由简单的环组成的,在n个点中,拿第n个节点:
1.与1个节点构成二元环,有(n-1)dp[n-2]种情况。
2.与k个节点构成k+1元环,首先从n-1个节点中取k个节点,环从第n个节点出发,第一次从这k个节点选一个节点连接,从这个节点再在这(k-1)没连接的点中选一个节点连接,以此类推,又因为环逆时针连接与顺时针连接情况相同,所以结果除2,情况dp[n-(k+1)]乘以图片说明乘以k!/2;
所以最后dp[n]=(n-1)*(dp[n-1]+dp[n-2])-dp[n-3]
(n-1)*(n-2)/2(过程请看https://ac.nowcoder.com/discuss/419109);

代码:

#include<bits/stdc++.h>
#define inf 1000000007

using namespace std;

typedef long long ll;

ll dp[100005];

int main()
{
    ll n, m;
    while(cin >> n >> m)
    {
    dp[0]=0;
    dp[1]=0;
    dp[2]=1;
    dp[3]=1;
    for(ll i=4;i<=n;i++)
    {
        dp[i]=(((dp[i-2]+dp[i-1])%m*(i-1))%m-(((i-1)*(i-2)/2)%m)*dp[i-3]%m+m)%m;
    }
    cout << dp[n] << endl;
    }
    return 0;
}

全部评论

相关推荐

屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
这是什么操作什么意思,这公司我服了...
斯派克spark:意思是有比你更便宜的牛马了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务