提交时间:2025-10-01 21:16:45
运行 ID: 38282
#include<bits/stdc++.h> using namespace std; string n; long long l=0,md=1000000007,ans,dp[3005][3][3]; inline long long pw(long long d,long long z){ if(z==0)return 1; if(z%2==1){ long long _; _=pw(d,z/2); _=_*_; _%=md; return ((_*d)%md); } else{ long long _; _=pw(d,z/2); _=_*_; _%=md; return ((_)%md); } } inline void s1(long long bx){ dp[0][1][1]=1,dp[0][0][0]=dp[0][0][1]=dp[0][1][0]=0; for(int i=1;i<=l;i++){ if(i==bx){ if(n[i]=='1'){ dp[i][0][0]=dp[i-1][0][0]+dp[i-1][1][0]+dp[i-1][0][1]+dp[i-1][1][1]; dp[i][0][1]=0; dp[i][1][0]=0; dp[i][1][1]=0; } else{ dp[i][0][0]=dp[i-1][0][0]; dp[i][0][1]=dp[i-1][0][1]; dp[i][1][0]=dp[i-1][1][0]; dp[i][1][1]=dp[i-1][1][1]; } } else if(i<bx){ if(n[i]=='1'){ dp[i][0][0]=dp[i-1][0][0]*3+dp[i-1][1][0]*2+dp[i-1][0][1]*2+dp[i-1][1][1]; dp[i][0][1]=dp[i-1][0][1]+dp[i-1][1][1]; dp[i][1][0]=dp[i-1][1][0]+dp[i-1][1][1]; dp[i][1][1]=0; } else{ dp[i][0][0]=dp[i-1][0][0]*3; dp[i][0][1]=dp[i-1][0][1]*2; dp[i][1][0]=dp[i-1][1][0]*2; dp[i][1][1]=dp[i-1][1][1]; } } else{ if(n[i]=='1'){ dp[i][0][0]=dp[i-1][0][0]*2+dp[i-1][1][0]+dp[i-1][0][1]; dp[i][0][1]=dp[i-1][0][1]+dp[i-1][1][1]; dp[i][1][0]=dp[i-1][1][0]+dp[i-1][1][1]; dp[i][1][1]=0; } else{ dp[i][0][0]=dp[i-1][0][0]*2; dp[i][0][1]=dp[i-1][0][1]; dp[i][1][0]=dp[i-1][1][0]; dp[i][1][1]=0; } } dp[i][0][0]%=md; dp[i][0][1]%=md; dp[i][1][0]%=md; dp[i][1][1]%=md; } } inline void ad(long long &ans,long long b){ b=b%md; ans=ans+b; ans%=md; return; } int main(){ cin>>n; l=n.length(); n=" "+n; for(int i=0;i<=l;i++){ s1(i); ad(ans,(pw(2,l-i))*(dp[l][0][0])); } printf("%lld",ans); }