矩阵乘法-洛谷P2233 [HNOI2002] 公交车路线

来源:互联网 发布:淘宝游戏装备 编辑:程序博客网 时间:2024/04/24 00:00

https://daniu.luogu.org/problem/show?pid=2233
矩阵这个很显然啊;
然后直接快速幂就好了;
至于为什么,这个就是矩阵的基本性质;
可以看我相关的博客;
然后到了E点就不懂,直接在乘法的时候处理一下就好了

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#include<map>#define Ll long longusing namespace std;int a[9][9]{//A B C D E F G H{0,0,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,1},//A{0,1,0,1,0,0,0,0,0},//B{0,0,1,0,1,0,0,0,0},//C{0,0,0,1,0,1,0,0,0},//D{0,0,0,0,1,0,1,0,0},//E{0,0,0,0,0,1,0,1,0},//F{0,0,0,0,0,0,1,0,1},//G{0,1,0,0,0,0,0,1,0},//H};struct jv{    int m[9][9];    jv(){memset(m,0,sizeof m);}}ans,c;int n,mo=1e3;jv cheng(jv x,jv y){    jv z;    for(int i=1;i<=8;i++)    for(int j=1;j<=8;j++)    for(int k=1;k<=8;k++)if(k!=5)    z.m[i][j]=(z.m[i][j]+x.m[i][k]*y.m[k][j])%mo;    return z;}int main(){    scanf("%d",&n);    n--;    for(int i=1;i<=8;i++)    for(int j=1;j<=8;j++)        c.m[i][j]=a[i][j];    ans=c;    while(n){        if(n&1)ans=cheng(ans,c);        n>>=1;        c=cheng(c,c);    }    printf("%d",ans.m[1][5]);}
1 0
原创粉丝点击