Loading

代码-CF946F Fibonacci String Subsequences

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=101;
int n,m,F[3][N][N][4],f[3];
string str;

//Math
const int mod=1e9+7;
void fmod(int &x){x+=x>>31&mod;}

//Main
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>str,f[0]=f[1]=2;
    R(i,n)R(t,4) F[str[i]-'0'][i][i][t]=1;
    R(i,m+1)if(i>1){
        int me=i%3,a=(i-1)%3,b=(i-2)%3;
        f[me]=1ll*f[a]*f[b]%mod;
        R(r,n)R(l,r+1){
            fmod(F[me][l][r][0]=F[a][l][r][0]+F[b][l][r][0]-mod);
            fmod(F[me][l][r][1]=F[a][l][r][1]+1ll*f[a]*F[b][l][r][1]%mod-mod);
            fmod(F[me][l][r][2]=1ll*F[a][l][r][2]*f[b]%mod+F[b][l][r][2]-mod);
            fmod(F[me][l][r][3]=1ll*F[a][l][r][3]*f[b]%mod+
                1ll*F[b][l][r][3]*f[a]%mod-mod);
        }
        R(len,n)if(len)R(l,n-len)
            for(int r=l+len,mid=l;mid<r;mid++){
                fmod(F[me][l][r][0]+=1ll*F[a][l][mid][0]*F[b][mid+1][r][0]%mod-mod);
                fmod(F[me][l][r][1]+=1ll*F[a][l][mid][1]*F[b][mid+1][r][0]%mod-mod);
                fmod(F[me][l][r][2]+=1ll*F[a][l][mid][0]*F[b][mid+1][r][2]%mod-mod);
                fmod(F[me][l][r][3]+=1ll*F[a][l][mid][1]*F[b][mid+1][r][2]%mod-mod);
            }
    }
    cout<<F[m%3][0][n-1][3]<<'\n';
    return 0;
}

/*

key:11

0 0
1 0
10 0
101 1
10110 14

*/
posted @ 2020-12-03 15:29  George1123  阅读(7)  评论(0编辑  收藏  举报