11.7noip模拟赛

11.7noip模拟赛

 

 题解:广义斐波那契数列 矩阵乘法

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;

LL n,A,B;

inline LL read(){
    char ch=getchar();LL x=0,f=1;
    for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';
    return x*f;
}

struct maxtix{
    int t[5][5];
}ans;

maxtix maxtix_mul(maxtix a,maxtix b){
    maxtix tmp;
    for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            tmp.t[i][j]=0;
            for(int k=1;k<=4;k++){
                tmp.t[i][j]=(tmp.t[i][j]%7+a.t[i][k]*b.t[k][j]%7)%7;
            }
        }
    }
    return tmp;
}

maxtix maxtix_mul(maxtix a,LL b){
    maxtix ret=a;b--;
    while(b){
        if(b&1)ret=maxtix_mul(ret,a);
        a=maxtix_mul(a,a);
        b>>=1;
    }
    return ret;
}

int main(){
    freopen("attack.in","r",stdin);
    freopen("attack.out","w",stdout);
    A=read();B=read();n=read();
    A%=7;B%=7;
    if(n<=1000000){
        LL f1=1,f2=1,f3;
        for(int i=3;i<=n;i++){
            f3=(A*f2+B*f1)%7;
            f1=f2;f2=f3;
        }
        printf("%lld\n",f2);
        fclose(stdin);fclose(stdout);
        return 0;
    }
    ans.t[1][1]=0;ans.t[1][2]=B;ans.t[2][1]=1;ans.t[2][2]=A;
    ans=maxtix_mul(ans,n-2);
    printf("%d\n",(ans.t[1][2]+ans.t[2][2])%7);
    fclose(stdin);fclose(stdout);
    return 0;
}
AC

相关文章:

  • 2020-11-04
  • 2018-10-28
  • 2021-08-08
  • 2021-10-17
  • 2021-06-27
  • 2021-08-09
  • 2021-11-08
  • 2021-12-21
猜你喜欢
  • 2021-08-23
  • 2021-12-25
  • 2021-07-21
  • 2022-12-23
  • 2021-10-08
  • 2021-08-09
相关资源
相似解决方案