• luogu4159 迷路 (矩阵加速)


    考虑如果只有距离为1的边,那我用在时间i到达某个点的状态数矩阵 乘上转移矩阵(就是边的邻接矩阵),就能得到i+1时间的

    然后又考虑到边权只有1~9,那可以把边拆成只有距离为1的

    具体做法是一个点拆成9个然后串联

     1 #include<bits/stdc++.h>
     2 #define pa pair<ll,ll>
     3 #define CLR(a,x) memset(a,x,sizeof(a))
     4 #define MP make_pair
     5 using namespace std;
     6 typedef long long ll;
     7 const int maxn=12,maxm=105,P=2009;
     8 
     9 inline char gc(){
    10     return getchar();
    11     static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;
    12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;
    13 }
    14 inline ll rd(){
    15     ll x=0;char c=gc();bool neg=0;
    16     while(c<'0'||c>'9'){if(c=='-') neg=1;c=gc();}
    17     while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc();
    18     return neg?(~x+1):x;
    19 }
    20 
    21 int id[maxn][maxn],N,M,T;
    22 int trans[maxm][maxm],tmp[maxm][maxm],ans[maxm][maxm];
    23 
    24 int main(){
    25     //freopen("","r",stdin);
    26     int i,j,k=0;
    27     N=rd();T=rd();
    28     for(i=1;i<=N;i++){
    29         for(j=1;j<=9;j++){
    30             id[i][j]=++M;
    31             if(j!=1) trans[id[i][j]][id[i][j-1]]=1;
    32         }
    33     }
    34     for(i=1;i<=N;i++){
    35         char s[13];scanf("%s",s+1);
    36         for(j=1;j<=N;j++){
    37             if(s[j]!='0') trans[id[i][1]][id[j][s[j]-'0']]=1;
    38         }
    39     }
    40     T--;
    41     memcpy(ans,trans,sizeof(ans));
    42     while(T){
    43         if(T&1){
    44             CLR(tmp,0);
    45             for(i=1;i<=M;i++){
    46                 for(j=1;j<=M;j++){
    47                     for(k=1;k<=M;k++){
    48                         tmp[i][j]=(tmp[i][j]+ans[i][k]*trans[k][j])%P;
    49                     }
    50                 }
    51             }
    52             memcpy(ans,tmp,sizeof(tmp));
    53         }
    54         CLR(tmp,0);
    55         for(i=1;i<=M;i++){
    56             for(j=1;j<=M;j++){
    57                 for(k=1;k<=M;k++){
    58                     tmp[i][j]=(tmp[i][j]+trans[i][k]*trans[k][j])%P;
    59                 }
    60             }
    61         }
    62         memcpy(trans,tmp,sizeof(tmp));
    63         T>>=1;
    64     }
    65     printf("%d
    ",ans[id[1][1]][id[N][1]]);
    66     return 0;
    67 }
  • 相关阅读:
    阅读《构建之法》
    准备工作
    课程总结
    第十四周总结
    第十三周总结
    Flex撑开
    多行文本展示为省略号样式的react组件
    如何在Spring Boot 中动态设定与执行定时任务
    System.arraycopy() 和 Arrays.copyOf() 的区别说明
    使用反射机制,获取 ArrayList 的容量大小
  • 原文地址:https://www.cnblogs.com/Ressed/p/10028563.html
Copyright © 2020-2023  润新知