求教
查看原帖
求教
142549
hbhz_zcy楼主2022/2/27 11:20

换了种做法,第二个样例过不去,并且调试不出来(大的样例没法调,小的不出错)。由于写法和题解略有不同,找不出错误。

#include<iostream>
#include<cstdio>
using namespace std;
const int mod=2009,maxn=150;
int N,T,N2,a[maxn][maxn],b[maxn][maxn],ls[maxn][maxn];
void calc(int _N,int _M,int _P,int _a[maxn][maxn],int _b[maxn][maxn],int _c[maxn][maxn]){
    for(int i=1;i<=_N;i++){
        for(int j=1;j<=_P;j++){
            ls[i][j]=0;
            for(int k=1;k<=_M;k++){
                ls[i][j]+=_a[i][k]*_b[k][j];
            }
            ls[i][j]%=mod;
        }
    }
    for(int i=1;i<=_N;i++){
        for(int j=1;j<=_P;j++){
            _c[i][j]=ls[i][j];
        }
    }
}
void qsm(int t){
    for(;t;t>>=1){
        if(t&1)  calc(N2,N2,N2,b,a,b);
        calc(N2,N2,N2,a,a,a);
    }
}
int main(){
    scanf("%d%d",&N,&T);N2=(N+1)*10;
    for(int i=1;i<=N;i++){//a little bigger
    	for(int j=0;j<=9;j++)  a[i*10+j][i*10+j+1]=1;
    }
    for(int i=1;i<=N;i++){
        char c=getchar();
        while(c<'0'||c>'9')  c=getchar();
        for(int j=1;'0'<=c&&c<='9';j++){
            if(c-='0')  a[i*10+c-1][j*10]=1;
//            printf("tag %d %d\n",i*10+c-1,j*10);
            c=getchar();
        }
    }
    for(int i=1;i<=N2;i++)  b[i][i]=1;
    qsm(T);
    printf("%d\n",b[10][N*10]);
    return 0;
}
2022/2/27 11:20
加载中...