【BZOJ2326】【codevs2314】数学作业,第100篇博文纪念

传送门1
传送门2
写在前面:标志性的~
思路:好久以前写的?好像忘记了……请原谅我吧!当时的我好像也是看着黄学长的blog写的

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
LL n;
int m;
struct matrix
{
    LL a[4][4];
    void clear()
    {
        for (int i=1;i<=3;i++)
        for (int j=1;j<=3;j++) a[i][j]=0;
    }
    void fill() {a[2][1]=a[3][1]=a[2][2]=a[3][2]=a[3][3]=1;}
}x,ans;
matrix get(matrix x,matrix y)
{
    matrix z;
    z.clear();
    for (int i=1;i<=3;i++)
    for (int j=1;j<=3;j++)
    for (int k=1;k<=3;k++)
    z.a[i][j]=(z.a[i][j]+(x.a[i][k]%m)*(y.a[k][j]%m)%m)%m;
    return z;
}
void qr(matrix x,LL y,LL z)
{
    LL cs=z-y/10+1;
    x.clear();
    x.a[1][1]=y;
    x.fill();
    while (cs)
    {
        if (cs%2) ans=get(ans,x);
        x=get(x,x);
        cs/=2;
    }
}
main() 
{
    scanf("%lld%d",&n,&m);
    for (int i=1;i<=3;i++) ans.a[i][i]=1;
    LL t=10;
    while (t<=n) qr(x,t,t-1),t*=10;
    qr(x,t,n);
    printf("%lld",ans.a[3][1]);
}

你可能感兴趣的:(【BZOJ2326】【codevs2314】数学作业,第100篇博文纪念)