P4159 迷路题解
P4159 迷路#
#
首先介绍一个有关邻接矩阵非常神奇的性质
假如我们现在有一个邻接矩阵 ,并且边是没有边权的 (即只有 )
我们用 表示矩阵 的 次方
那么我们有: 表示 经过 条边抵达 的方案数
至于为什么可以感性理解一下:
根据矩阵乘法的定义,我们显然有:
也就可以理解成:从 走 条边到 相当于先走 条边到 再从 走一条边到
思路:
回到这道题
由于此题每条边边权 满足 ,显然我们不能直接利用上面的
但是由于 很小,我们可以考虑把每 个点都拆成 个点来考虑
然后用矩阵快速幂搞就可以了
注:交的时候卡了下常,放的代码把 去了
code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
const int mod=2009;
struct matrix{
int n,A[181][181];
inline matrix(re int x){n=x,memset(A,0,sizeof(A));}
inline matrix operator *(const matrix B) const{
matrix C(n);
for(re int i=1;i<=n;++i)
for(re int j=1;j<=n;++j)
for(re int k=1;k<=n;++k)
C.A[i][j]=(C.A[i][j]+A[i][k]*B.A[k][j])%mod;
return C;
}
inline matrix operator ^(const int idx) const{
matrix res(n),B=*this;
for(re int i=1;i<=n;++i)
res.A[i][i]=1;
for(re int qwq=idx;qwq;qwq>>=1,B=B*B)
if(qwq&1) res=res*B;
return res;
}
};
int n,m;
inline int get_num(re int x,re int y){
return (x-1)*10+y;
}
signed main(){
read(n),read(m);
matrix f(180);
for(re int i=1;i<=n;++i){
for(re int j=1;j<10;++j)
f.A[get_num(i,j)][get_num(i,j+1)]=1;
for(re int j=1;j<=n;++j){
re int x;
scanf("%1d",&x);
if(x) f.A[get_num(i,x)][get_num(j,1)]=1;
}
}
f=f^m;
write(f.A[1][10*n-9]);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!