654. A simple math problem
Time Limit: 1000 ms / Mem. Limit: 524288 KiB / IO: stdio
Given a number , you should calculate module 11
Input
A single line with an integer ()
Output
Output one integer, module 11
Examples
Input 1
Output 1
Input 2
Output 2
Input 3
Output 3
Note
.
Source
第六届华中区程序设计邀请赛暨武汉大学第十五届校赛
此题就是之前所说的,矩阵快速幂递推啦。我就真的很好奇,为什么当时想不到用矩阵快速幂……
题目,很容易理解,输入一个n,把从1开始到n的所有数字连成一个数字,然后问这个数字模11的结果是什么。
首先,显然会想到n的结果就是n-1的结果乘上n的位数加上n再模11。O(n)的算法,但是仍然会超时。于是我就开始了漫长的找规律之旅,然后发现这是个无底洞……自己手残经常敲错东西,然后有时又忘了改一些东西。然后中午没有吃东西,脑子一片混乱,总之耗了一个多小时还没有弄出来。不,是WA了两次,然后放弃了。
现在想来,把我的思想总结一下就是f(n)=(f(n-1)*10^p+n)%11。其中p表示n的位数。我想,如果我把这个式子写出来或许我就可以想到矩阵快速幂了,然而……那么我们就来说说矩阵对递推的式的优化吧。对于任何线性的递推,我们都可以把递推关系写在矩阵里面,即可以把通项公式写成an=a0*matrix^n,这样子的话,我们就可以利用矩阵乘法优化这个递推的过程。
这题的话由于p的不同,所以我们要分成18个矩阵并分成一段一段地区求。构造方式的话设递推矩阵为x,x={{10^p,0,0}{1,1,0}{1,1,1}},然后的话首项是an={{an,n,1}{0,0,0}{0,0,0}},这样子刚好就可以完成递推,不信自己去试一试。关于构造这个矩阵,我记得我高中高OI的时候好像读过一篇文章专门讲如果构造递推矩阵,然而现在不记得了……下次找到了再讲吧。
还有,值得注意到是,对于求位数p,本想装个B用log换底直接求位数,但是由于一些精度问题老师错……最后还是妥协了……代码如下: