zoukankan      html  css  js  c++  java
  • 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("
    ");
            for(int i=0;i<=n;i++)
            {
                for(int j=0;j<=m;j++) printf("%d ",ai[i][j]);
                printf("
    ");
            }
            printf("
    ");
        }
    };
    
    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;
    }
  • 相关阅读:
    报表图片不显示的问题(一)
    数据库时区问题
    变色
    给div加滚动条,当内容超过它的范围的时候
    Apple Style Effect
    easyui发生重叠现象的原因
    mysql 获取字符串长度
    纯css的带下拉菜单的导航条
    jQuery验证控件jquery.validate.js使用说明+中文API
    background-position 用法详细介绍
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6912944.html
Copyright © 2011-2022 走看看