首页 > 技术文章 > 7.19 NOIP模拟6

hzoi-cbx 2019-07-20 15:29 原文

这次考试又一次让mikufun认识到了常数的重要性

T1.那一天我们许下约定

  这题一看到D<=1e12,想都没想,矩阵快速幂!然后飞快的码了一个,复杂度n^3logD,让后我观察了一下这个转移矩阵,发现它有一个神奇的性质:

  1 1 1 1 1 0

  0 1 1 1 1 1

  0 0 1 1 1 1

  0 0 0 1 1 1

  0 0 0 0 1 1

  0 0 0 0 0 1

  这。。。(显然不是)循环矩阵?于是我就把单次乘法优化成了n^2,复杂度变成了n^2logD,然后测了一下极限数据,单个跑了1.85s,这多测好像要死啊。。。。不管了,然后就扔下了。

  考后发现被卡到只有40分。。。比暴力就多了10分。然后发现这题可以开int128,中途不取模,乘完后O(n)取模,竟然A掉了。。

  为了吸取教训,以后矩阵题,若模数很小(HH去散步.BZOJ4128),可以开long long 不取模,若模数较大,可以开int128不取模。

  刚才又发现对于D来说,将Dmod998244353不会影响最终答案(这个可以用正解理解),我考试的代码加了这个也AC了。。。

  好了,以上都是暴力解法,然后是正解:

  我们可以发现,真正会给她饼干干至至多有N天。
所以可以设 f [i][ j ] 表示真的给她饼干干的天数为 i 一一共给出了了 j 块饼干干的方方案数.
可以发现 : f [ i ][ j ]=∑k f[ i-1 ][ k ]( j-m<=k<j )所以只需维护前缀和即可做到 O(1) 转移
然后答案就是f[ i ][ n ]*C(D, i );这么***的解法为啥我没有想到啊

推荐阅读