AC日记——摆花
2024-08-31 02:09:22
思路:
矩阵加速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[][]; void mem()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++) ai[i][j]=;
}
} void debug()
{
printf("\n");
for(int i=;i<=n;i++)
{
for(int j=;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=;i<=res.n;i++)
{
for(int j=;j<=res.m;j++)
{
for(int v=;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&) res=mul(res,pos);
pos=mul(pos,pos),mi=mi>>;
// res.debug();
}
return res;
} int main()
{
freopen("harem.in","r",stdin);
freopen("harem.out","w",stdout);
char ch[];
MatrixType pos;
scanf("%d%d",&n,&m);
pos.n=m,pos.m=m;
for(int i=;i<=m;i++) pos.ai[][i]=;
for(int i=;i<=m;i++)
{
scanf("%s",ch+),pos.ai[i][]=;
for(int j=;j<=m;j++) pos.ai[i][j]=(ch[j]-'')^;
}
// pos.debug();
MatrixType p;
p.mem(),p.n=m,p.m=;
for(int i=;i<=m;i++) p.ai[i][]=;
// p.debug();
MatrixType ans=mul(poww(n-,pos),p);
// ans.debug();
ll ans_=;
for(int i=;i<=m;i++) ans_=(ans_+ans.ai[i][])%mod;
cout<<ans_;
return ;
}
最新文章
- JavaScript - 如果...没有方法
- Fragment的初步设计
- android 横竖屏限制如何配置
- fzu Problem 2140 Forever 0.5(推理构造)
- Javascript继承实现
- css之自动换行
- 关于STM32 定时器 PWM 实时调节占空比时,预装载特性
- ExtJs MVC应用架构示例
- spring 上传图片
- 【JSON异常系列】new JSONObject对象时卡死原因
- object-c编程tips-timer
- sqlserver不能直接create table as select
- C#关于HttpClient的应用(一):获取IP所在的地理位置信息
- 贴一份用delphi修改注册表改网卡MAC地址的代码
- Python尾递归-创始人为何不愿TRE以及我们如何模拟TRE
- ping vs telnet, what is the difference between them and when to use which?
- [HAOI2008]移动玩具
- AFNetworking封装-项目使用
- MONGODB(四)——DBObject与JavaBean转换
- 《Linux内核分析》第七周: 可执行程序的装载