佳佳的fib

信息学奥赛一本通

题意:设\(T(n)=\sum_{i=1}^nif(i)\),给定\(n\)\(m\),求\(T(n)\mod m\)的值.

某大佬的博客详细讲述了三种做法,我这里就不再赘述了.戳我

#include<bits/stdc++.h>
using namespace std;
inline int read(){
   int s=0,w=1;char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
   return s*w;
}
int n,mod;
struct matrix{
    int a[5][5];
    matrix operator *(matrix b){
        matrix c;
        for(int i=0;i<5;i++)
            for(int j=0;j<5;j++)
                c.a[i][j]=0;
        for(int i=0;i<5;i++)
            for(int j=0;j<5;j++)
                for(int k=0;k<5;k++)
                    c.a[i][j]=(c.a[i][j]+1ll*a[i][k]*b.a[k][j])%mod;
        return c;
    }
}S,T;
int main(){
    n=read(),mod=read();
    S.a[0][0]=0;S.a[0][1]=1;S.a[0][2]=0;S.a[0][3]=1;S.a[0][4]=0;
    T.a[0][0]=0;T.a[0][1]=1;T.a[0][2]=0;T.a[0][3]=2;T.a[0][4]=0;
    T.a[1][0]=1;T.a[1][1]=1;T.a[1][2]=0;T.a[1][3]=1;T.a[1][4]=0;
    T.a[2][0]=0;T.a[2][1]=0;T.a[2][2]=0;T.a[2][3]=1;T.a[2][4]=0;
    T.a[3][0]=0;T.a[3][1]=0;T.a[3][2]=1;T.a[3][3]=1;T.a[3][4]=1;
    T.a[4][0]=0;T.a[4][1]=0;T.a[4][2]=0;T.a[4][3]=0;T.a[4][4]=1;
    while(n){if(n&1)S=S*T;T=T*T;n>>=1;}
    printf("%d\n",S.a[0][4]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/PPXppx/p/10807969.html
fib