Symmetric Matrix 题解

Symmetric Matrix

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

太菜了,直接上OEIS

然后发现递推式:

于是。。。完了/x

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
int n,m;
int a[N];
int main(){
    while(~scanf("%d%d",&n,&m)){
        a[2]=1,a[3]=1%m,a[4]=6%m;
        for(int i=5;i<=n;++i){
            a[i]=(1LL*(i-1)*(a[i-1]+a[i-2]))%m;
            a[i]=(a[i]-(1LL*(i-1)*(i-2)/2*a[i-3])%m);
            a[i]%=m;
        }
        a[n]=(a[n]+m)%m;
        printf("%d\n",a[n]);
    }
    return 0;
}

还是老老实实推下式子吧。。。

这道题我们最好把矩形看做一个图的邻接矩阵,这样,就很好推了

题目就等价于,每个点有且仅有两条边和其他点连接,但不和自己连接

那么,我们设a[i]表示现在有i个点的情况

假设,我们已经递推出了a[1]-a[i-1]的值,那么,对于新增点i,我们有如下转移:

我们先将新点和以前的一个点先连一条边,然后把它们看做一个整体

有如下讨论:

1.整体相对独立,即两个点之间连两条边

贡献:

2.整体不独立,和剩余的i-2个点组合(整体连两条边相当于两个点分别和其它点连一条边)

贡献:

看了下式子,感觉没问题,但交上去后。。。wa了。。。

为什么?

因为,我们有考虑重复的地方!

因为,我们一开始是选了一个点和新点连边构成一个整体,然后,和其他点讨论。

但,如果整体只和一个点“其他点”连边会怎么样呢?

我们设和新点构成整体的点叫x,“其他点”叫y

那么,“新点和x构整体连y”和“新点和y构整体连x”其实是两个完全一样的情况,但,我们却计算了两次!

所以,我们需要再把"新点和一个点构成整体后只和一个点连边"的情况数减半,即为:

(先从i-1个点选一个点与新点做整体,再选一个点与整体单独相连)(剩下i-3个点自由组合)(方案减半)

然后,就可以了~

(菜鸡是根据答案逆推的,可能比顺推的要简单些qwq)

全部评论

相关推荐

08-24 14:45
河南大学 Java
如图所示,我在大二升大三的暑假拿到了美团的日常实习,这一路走来很不容易,所以想分享一下经验,也算是传承,因为一路走来帮助我的人也有很多。第一😇(学习路线),看黑马的视频只是一个入门,我是一直看完了springcloud。第二😇(项目),项目的话没有好坏,只有新奇与陈旧,新的项目用的人少的往往能达到让面试官眼前一亮的效果,所以没有固定的推荐,但是大家可以努力去多做几个项目,这样技术你都学会了,之后可以根据新的项目进行改造。第三😇(八股文),这个真就是跟着网站上背就行了&nbsp;一定要自己整理一套自己的八股笔记,有自己的思考与理解,我理解之后即使几个月不看也能顺滑的说出来。第四😇(面试注意),面试的时候要体现自己的思考,如果你能说出来一整个问题的逻辑那很好,但是不要着急,先说百分之八十,后百分之二十说是自己思考出来的。第五😇(当你所有的都融会贯通),八股项目相结合,八股与八股相串联,问到你一个简单的问题可以扩展延伸让面试官措不及防,被你控制,这样面试官能够问你不会的问题的概率也会大大下降。等待与努力的过程是无比的焦虑与忐忑,当字节三面挂与快手二面挂的时候我已经开始摆烂了,因为双非的机会真的不多,都没把握到,最后还是美团收留了我,任何人的路径都是不可复制的,任何人的经历也是独一无二的,不要受别人影响,加油做自己。接受大家积极发问,也可以私信我哦。
永泽one:美团官网投的嘛佬,根本约面不了
大厂面试问八股多还是项目...
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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