您的位置:首页 > 运维架构

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: