纪中集训d2 提高A组模拟

本文解析了三道OI竞赛题目,包括特殊图的最短路径问题、特殊斐波那契进制表示的最大向量求解及基于特定规则的数列求和问题。文章提供了详细的解题思路与算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次情况稍微好了点,但是还是各种写跪23333……不得不说,纪中的OIer数学推演能力好像都太好了点,就是讲的课很容易让人听不懂……
【T1】【JZOJ 3777】
这道题目是一类特殊图的最短路,这种题目一般是打表+找规律+证明(一般不会去想?)……讲的是对于一个格点图,对于点(i,j)定义权值为F(i,j)=F(i1,j)+F(i,j1),边界i=0j=0F(i,j)=1,同时在(i,j)(i,j1)(i1,j)间相应分别连两条零权值边,问(0,0)(n,m)的最短路。
容易发现最短路就是沿着边走,不妨设n<m,那么最短路就是(0,0)(0,m)(n,m),因为从另一个方向的折线显然比它长。那么问题就变成了求m+i=1nF(i,m)。由于我们马上可以发现F(i,j)其实对应杨辉三角,进而对应组合数,所以上面那个式子=m+i=1nC(i+m1,i
怎样快速求呢?这里有两个思路:
思路一,注意到

C(i,j)=j!i!(ji)!
C(i+1,j+1)=(j+1)!(i+1)!(ji)!

那么我们得到
C(i+1,j+1)=j+1i+1C(i,j)=(j+1)(i+1)1C(i,j)

就可以很方便地用逆元直接推啦~
直接搞是O(nlgn),如果用线性推逆元(推到nm)就可以直接做到O(n),但是比较麻烦。
思路二,考虑到
C(i,j)=C(i1,j)+C(i1,j1)
我们再次注意到那个式子里面我们如果把C(m,0)给补上去,然后由上面那条式子,可以得到
C(m,0)+C(m,1)+C(m+1,2)+

=C(m+1,1)+C(m+1,2)+C(m+2,3)+

==C(m+n1,n)

这个可以直接算若干阶乘,然后全部阶乘完再做逆元,这样似乎比较快?而且还挺好写的,时间复杂度O(n+lgn)
【T2】【JZOJ 3769】
题意是考虑一种特殊的斐波那契进制来表示数,即把数表示成每位权值分别为1,2,3,5,8...Fib(i)的向量a,使得这个a最大,也就是|a|最大且对于任意一个表示同样数且长度一样的的向量a,设从高位到低位第一个不同的是aiai,那么都要满足ai>ai。这里给出两个这样的向量,求把这两个向量对应加起来之后的最大向量。
我们发现,满足最大的向量一定没有相邻的两个一,而且也不可能有大于一的数,前一个可以合并两个一,后一个可以分拆,比如2xi=xi2+xi+1,这样向量都会更大。于是我们先定义一次迭代操作就是先把所有的大于一的数分拆,然后再统一合并相邻的非零数,接着听说跑个玄学次就能过了,我也不会证……不过还是有可能构造出数据的。隔壁zmz dalao认为跑lgn次就可以了,但是我也还是证不了,根据数据只用10+次。

【T3】【JZOJ3771】
对于这道题目,我们直接来讨论下满分算法。考虑到如果不算所有乘上了2i的数,那么第一个盒子里的数都是奇数。那么我们容易发现,第一个盒子里面的所有数实际上就是所有形式为a2mi的数,其中a都是奇数,结合标号条件,我们还需要a2mi+m+1n。这时我们考虑枚举下i,就可以求出对应的a的范围,然后全部加一块就行了。我们发现,实际上我们给[n2](这里[x]表示下取整)每次除多2m就行了……反正高精度里面压压位,然后直接用位运算加速就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值