D. GukiZ and Binary Operations(矩阵+二进制)
2015-06-16 20:46
471 查看
D. GukiZ and Binary Operations
We all know that GukiZ often plays with arrays.Now he is thinking about this problem: how many arrays a, of length n, with non-negative elements strictly less then 2l meet the following condition:
我用dp[i][j]表示有i个数,j表示最后一个数为0还是为1时满足没有相邻为1的方案数,因为n>=2,所以i只有大于2才有意义。首先dp[1][0]=1,dp[1][1]=1 , dp[2][0]=dp[1][0]+dp[1][1],dp[2][1]=dp[1][0] ………… 通项公式就是dp [0]=dp[n-1][0]+dp[n-1][1],dp [1]=dp[n-1][0] ,意思是当你长度为n最后一个数字为0时,你可以在长度为n-1最后一个数字为0或为1后面补0,这样不存在相邻为1的方案,若最后一位要为1,就只能在n-1最后一位为0的时候补1,这样才不会有相邻的1。最后你要计算的是all =dp [0]+dp [1],其中dp [0]==all[n-1],dp [1]==dp[n-1][0]==all[n-2],推出all =all[n-1]+all[n-2],这就是斐波那契数列。但这初始值有些不同,all = fib[n+1] ,fib第0个元素跟第1个元素为1. 算出不相邻的方案之后,只要算出总的方案数2^n(每一位取0或取1)减去不相邻的方案,即为相邻的方案。你也可以用dp去推一下,我稍微提一下,我用c 表示长度为n时具有相邻1的方案数,c[2]=1 , c[3]=c[2]*2+dp[2][1]………… c =c[n-1]*2+dp[n-1][1]=c[n-1]*2+all[n-3]这里的dp是上面求的不存在相邻的1,由于c[n-1]具有相邻的1所以下一位任意,dp[n-1][1]是长度为n-1最后一位为1,我们补1让它有相邻的1. 得出是斐波那契数列之后,我们可以用矩阵快速幂求解斐波那契数,也可以用矩阵快速幂求c 注意:这道题wa点挺多的,首先是unsigned long long在判断是否越界的时候用,还有快速幂的次数是long long,枚举l位时候,第63位已经暴了10^18,所以需要特判。最后输出结果要%mod,不然它有mod为1且l=0的样例
View Code
相关文章推荐
- tomcat自动重启的配置
- linux学习简单汇总
- Opencv同时读入多个视频
- centos 安装gdb
- Apache与Nginx优缺点比较
- OpenGL Tutorial: (1) Setting up OpenGL with Visual Studio
- Hadoop中HDFS写入文件的原理剖析
- linux 下 mysql-python 安装
- Nginx Rewrite规则初探
- Linux设置快捷命令
- GukiZ and Binary Operations(矩阵+二进制)
- linux 下硬盘序号
- 逻辑架构和物理架构
- LINUX AWK UNIQ GREP WC
- Python:模拟linux命令cat
- 查看linux的版本
- lvs(+keepalived)、haproxy(+heartbeat)、nginx 负载均衡的比较分析
- OpenCart多图片拖放式上传管理器
- OpenCart多图片拖放式上传管理器
- 闰秒对linux的影响分析及解决