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; }