hiho 1318 非法二进制数 dp
生活随笔
收集整理的這篇文章主要介紹了
hiho 1318 非法二进制数 dp
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#1318 : 非法二進制數
時間限制:10000ms 單點時限:1000ms 內存限制:256MB描述
如果一個二進制數包含連續的兩個1,我們就稱這個二進制數是非法的。
小Hi想知道在所有?n?位二進制數(一共有2n個)中,非法二進制數有多少個。
例如對于?n?= 3,有 011, 110, 111 三個非法二進制數。
由于結果可能很大,你只需要輸出模109+7的余數。
輸入
一個整數?n?(1 ≤?n?≤ 100)。
輸出
n?位非法二進制數的數目模109+7的余數。
樣例輸入簡單的動態規劃。
我們可以先算出一共有多少個?合法?的二進制數。 用f[n][x]表示n位二進制數,最后1位是x(x取值0或1),合法的二進制數的數目。 于是有:
f[n][0] = f[n - 1][0] + f[n - 1][1] f[n][1] = f[n - 1][0];#include<bits/stdc++.h> using namespace std; #define ll long long #define mod 1000000007 #define pi (4*atan(1.0)) const int N=2e3+10,M=1e6+10,inf=1e9+10; ll dp[N][2]; ll quick(ll a,int x) {ll ans=1;while(x){if(x&1)ans*=a,ans%=mod;x>>=1;a*=a;a%=mod;}return ans; } int main() {int x,y,z,i,t;scanf("%d",&x);dp[1][0]=1;dp[1][1]=1;for(i=2;i<=x;i++){dp[i][0]=(dp[i-1][1]+dp[i-1][0])%mod;dp[i][1]=dp[i-1][0];}cout<<((quick(2,x)-dp[x][0]-dp[x][1])%mod+mod)%mod<<endl;return 0; }
?
?轉載于:https://www.cnblogs.com/jhz033/p/5602909.html
總結
以上是生活随笔為你收集整理的hiho 1318 非法二进制数 dp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20145205《Java程序设计》课程
- 下一篇: 如何一键部署项目代码自动更新