操作数 解题报告
操作数
http://www.nowcoder.com/questionTerminal/966fde4871834ceeadbfc2122b76257a
这一题确实有一定的思维难度
首先观察到k的范围,显然不能用朴素方法求解。
同时我们注意到每个数都等于它的前缀和
所以我们可以构造如下矩阵:
1 1 1 ... 1 0 1 1 ... 1 0 0 1 ... 1 ........... 0 0 0 0...1
也就是说,我们只要让原数列 乘上上面那个矩阵,就能得到序列
经过 次操作之后就能得到结果
即我们要求的结果等于
然后怎么快速求的矩阵乘呢?
矩阵快速幂?
复杂度承受不了
那么我们手推一下
假设是一个 的矩阵
就有
怎么感觉哪里这么眼熟?
我们把杨辉三角写下来康康
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
注意到了吗?杨辉三角的第二列,第三列,第四列
前三个对应的就是结果矩阵的第一行
我们再看看的
那么,我们就可以大胆的推测如下结论,初始矩阵的 次对应的就是杨辉三角的第 列的前 个
然后我们知道杨辉三角是和组合数一一对应的,第 行第 个表示
但是这样做还是会有一个问题,就是在求组合数的时候复杂度会承受不了,而且分别求分子分母取模的做法会导致Wrong Answer
只要对杨辉三角有一定了解的同学就一定知道,第列的数字和从第行第一个向右下取得数字是一样的
那这个就可以很方便的求出来了,,我们的和是同时增加的,所以不变,只需要处理一下每一个位置对应的和即可
只要处理出第一行即可