AC日记——摆花

 

思路:

  矩阵加速dp;

 

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define ll long long
#define mod (1000000007)

struct MatrixType {
    int n,m;
    
    ll ai[105][105];
    
    void mem()
    {
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=m;j++) ai[i][j]=0;
        }
    }
    
    void debug()
    {
        printf("\n");
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=m;j++) printf("%d ",ai[i][j]);
            printf("\n");
        }
        printf("\n");
    }
};

int n,m;

MatrixType mul(MatrixType aa,MatrixType bb)
{
    MatrixType res;
    res.n=aa.n,res.m=bb.m,res.mem();
    for(int i=0;i<=res.n;i++)
    {
        for(int j=0;j<=res.m;j++)
        {
            for(int v=0;v<=res.n;v++)
            {
                res.ai[i][j]=(res.ai[i][j]+aa.ai[i][v]*bb.ai[v][j])%mod;
            }
        }
    }
    return res;
}

MatrixType poww(int mi,MatrixType pos)
{
    MatrixType res=pos;mi--;
    while(mi)
    {
        if(mi&1) res=mul(res,pos);
        pos=mul(pos,pos),mi=mi>>1;
//        res.debug();
    }
    return res;
}

int main()
{
    freopen("harem.in","r",stdin);
    freopen("harem.out","w",stdout);
    char ch[300];
    MatrixType pos;
    scanf("%d%d",&n,&m);
    pos.n=m,pos.m=m;
    for(int i=0;i<=m;i++) pos.ai[0][i]=1;
    for(int i=1;i<=m;i++)
    {
        scanf("%s",ch+1),pos.ai[i][0]=1;
        for(int j=1;j<=m;j++) pos.ai[i][j]=(ch[j]-'0')^1;
    }
//    pos.debug();
    MatrixType p;
    p.mem(),p.n=m,p.m=0;
    for(int i=0;i<=m;i++) p.ai[i][0]=1;
//    p.debug();
    MatrixType ans=mul(poww(n-1,pos),p);
//    ans.debug();
    ll ans_=0;
    for(int i=0;i<=m;i++) ans_=(ans_+ans.ai[i][0])%mod;
    cout<<ans_;
    return 0;
}

 

posted @ 2017-05-27 15:05  IIIIIIIIIU  阅读(231)  评论(0编辑  收藏  举报