Symmetric Matrix
题意:构造满足上述4个条件的矩阵,问能构造多少个
分析:可以把这个矩阵看做是无向图的邻接矩阵,那么我们就可以把问题转化为求无向图中所有点的度数都为2的图有多少个。我们考虑f\left [ n\right ]表示n个结点的图满足条件的数量。
我们考虑图中的最后一个点所在的环中有多少个结点:
1.当最后一个环只有两个结点的时候:(为什么不合并为第二种情况呢,因为当一个环只有两个点时,除以2就不对了)
C_{n-1}^{1}\ast f\left ( n-2\right )=\left ( n-1\right )\ast f\left ( n-2\right )
表示从除最后一个点以外的n-1个点中选出1个点与最后一个点形成环,前n-2个点形成满足条件的图的总情况有多少
2.考虑最后一个点所在的环有n-k个结点的情况,其中\left ( 2\leq k且\left ( n-k\right )> 2\right )即\left ( 2\leq k\leq n-3\right )
我们可以先从前n-1个结点中选出k个结点形成满足条件的图,那么剩下的n-k-1个结点就有(n-k-1)!种形成链的方式(因为每个点的度为2,且这n-k-1个结点要与最后一个点形成环,所以这n-k-1个结点只会形成链),然后我们再加入最后一个结点与这条链的首尾相连形成环,由于首尾的顺序与形成的环的方式是无关的,所以这里要除以一个2将重复的情况去除(比如1,2,3三个结点的全排列中就有1,2,3和3,2,1两种,由于它是无向图,所以在加入最后一个结点4之后形成的环都是1-2-3-4-1,就有一种情况重复计算了)
所以:公式为:
C_{n-1}^{k}\ast f\left ( k\right )\ast \frac{\left ( n-k-1\right )!}{2}
最后:
f\left ( n\right )=\left ( n-1\right )\ast f\left ( n-2\right )+\sum_{k=2}^{n-3}C_{n-1}^{k}\ast f\left ( k\right )\ast \frac{\left ( n-k-1\right )!}{2}
f\left ( n\right )=\left ( n-1\right )\ast f\left ( n-2\right )+\sum_{k=2}^{n-3}\frac{\left ( n-1\right )!}{k!\ast \left ( n-k-1\right )!}\ast f\left ( k\right )\ast \frac{\left ( n-k-1\right )!}{2}
1.f\left ( n\right )=\left ( n-1\right )\ast f\left ( n-2\right )+\sum_{k=2}^{n-3}\frac{\left ( n-1\right )!}{k!}\ast \frac{f\left ( k\right )}{2},那么有
2.\left ( n-1\right )\ast f\left ( n-1\right )=\left ( n-1\right )\ast \left ( n-2\right )\ast f\left ( n-3\right )+\left ( n-1\right )\ast \sum_{k=2}^{n-4}\frac{\left ( n-2\right )!}{k}\ast \frac{f\left ( k\right )}{2}
1式-2式得:
f\left ( n-1\right )\ast \left ( f\left ( n-1\right)+f\left ( n-2\right )\right )-\left ( n-1\right )*\left ( n-2\right )\ast f\left ( n-3\right )/2
AC_Code:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 1e5+10; 5 #define rep(i,first,second) for(int i=first;i<=second;i++) 6 #define dep(i,first,second) for(int i=first;i>=second;i--) 7 8 int n,m; 9 ll f[maxn]; 10 int main() 11 { 12 while( ~scanf("%d%d",&n,&m)){ 13 if( m==1 ){ 14 printf("0\n"); 15 continue; 16 } 17 f[1]=0; 18 f[2]=f[3]=1; 19 rep(i,4,n){ 20 f[i]=((i-1)*(f[i-1]+f[i-2])%m-((ll)(i-1)*(i-2)/2*f[i-3])%m + m)%m; 21 } 22 printf("%lld\n",f[n]); 23 } 24 return 0; 25 }
参考博客:here
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥