题意:求满足以下条件的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; }