Reading comprehension HDU - 4990 解题报告

这道题。。。一开始用整数的矩阵快速幂做然后成功各种BUG加WA,不得以换做了结构体矩阵快速幂,然后还是WA,原来是,三行一列,被我写成了一行三列,然后提交还是WA,原来是数据范围太大,然后改为ll,提交成功AC(一把辛酸泪)。

下面给出AC代码,注意构造的矩阵可能会有所不同,只要结果正确即可


#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 10+10;
int n,m;

struct matrix
{
    int a[maxn][maxn];
}oeign,res,ste;

matrix arr_mult(matrix A,matrix B)
{
    matrix t;
    memset(t.a,0,sizeof(t.a));
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            for(int k=1;k<=3;k++)
            {
                t.a[i][j]+=A.a[i][k]%m*B.a[k][j]%m;
                t.a[i][j]=t.a[i][j]%m;
            }
        }
    }
    return t;
}

matrix arr_mult1(matrix A,matrix B)
{
    matrix t;
    memset(t.a,0,sizeof(t.a));
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=1;j++)
        {
            for(int k=1;k<=3;k++)
            {
                t.a[i][j]+=A.a[i][k]%m*B.a[k][j]%m;
                t.a[i][j]=t.a[i][j]%m;
            }

        }
    }
    return t;
}

void arr_pow(int n)
{
    memset(res.a,0,sizeof(res.a));
    for(int i=1;i<=5;i++) res.a[i][i]=1;
    while(n)
    {
        if(n&1) res=arr_mult(res,oeign);
        oeign=arr_mult(oeign,oeign);
        n >>= 1;
    }
}

int main()
{
    while(scanf("%d %d",&n,&m)==2)
    {
        if(n==1) {printf("%d\n",n%m); continue;}
        else if(n==2)  {printf("%d\n",n%m); continue;}
        memset(oeign.a,0,sizeof(oeign.a));
        memset(ste.a,0,sizeof(ste.a));
        oeign.a[1][1]=oeign.a[1][3]=1,oeign.a[1][2]=2;
        oeign.a[2][1]=1,oeign.a[2][2]=oeign.a[2][3]=0;
        oeign.a[3][1]=0,oeign.a[3][2]=0,oeign.a[3][3]=1;

        ste.a[1][1]=2,ste.a[2][1]=1,ste.a[3][1]=1;//注意是竖着的,每次行数加一
        arr_pow(n-2);
        ste=arr_mult1(res,ste);

        printf("%d\n",ste.a[1][1]%m);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/NCC__dapeng/article/details/81949358