NC17134 Symmetric Matrix(数学+dp)

这道题的矩阵需要转化一下思路,转换成邻接矩阵,也就是看成某个点与别的点的连线

因为每个点只和别的点有且只有两条线,因此每个点都在一个环中

这个有两种情况,一种是重边,也就是两点间是一个环,其他就是随意的

因此可以通过组合数公式推出dp方程

#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;
    }
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/13253580.html