这道题的矩阵需要转化一下思路,转换成邻接矩阵,也就是看成某个点与别的点的连线
因为每个点只和别的点有且只有两条线,因此每个点都在一个环中
这个有两种情况,一种是重边,也就是两点间是一个环,其他就是随意的
因此可以通过组合数公式推出dp方程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e5+10; const int mod=1e9+7; ll f[N]; int main(){ ios::sync_with_stdio(false); ll n,m; while(cin>>n>>m){ ll i; f[0]=1,f[1]=0,f[2]=f[3]=1; for(i=4;i<=n;i++){ f[i]=((i-1)*(f[i-1]+f[i-2])%m-(i-1)*(i-2)/2%m*f[i-3]%m+m)%m; } cout<<f[n]<<endl; } }