记录编号 582700 评测结果 AAAAAAAAAA
题目名称 加强斐波那契数列 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2023-09-22 19:52:50 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//矩阵快速幂 O(k^3log(n)) 
const ll mod = 1000000007;
ll n;
void mul(ll c[2],ll a[2][2]){
    ll f[2];
    memset(f,0,sizeof(f));
    for(int j = 0;j <= 1;j++){
        for(int k = 0;k <= 1;k++){
            f[j] = (f[j] + (c[k] * a[k][j]) % mod) % mod;
        }
    }
    memcpy(c,f,sizeof(f));
}
void mulself(ll a[2][2]){
    ll f[2][2];
    memset(f,0,sizeof(f));
    for(int i = 0;i <= 1;i++){
        for(int j = 0;j <= 1;j++){
            for(int k = 0;k <= 1;k++){
                f[i][j] = (f[i][j] + (a[i][k] * a[k][j]) % mod) % mod;
            }
        }
    }
    memcpy(a,f,sizeof(f));//用f替换a 
}
int main(){
    freopen("FibJQ.in","r",stdin);
    freopen("FibJQ.out","w",stdout);
    scanf("%lld",&n);
    ll a[2][2] = {{0,1},{1,1}},c[2] = {0,1};//斐波那契 
    //矩阵快速幂初始化
    while(n){
        if(n & 1)mul(c,a);
        mulself(a);
        n >>= 1;
    }
    printf("%lld\n",c[0]);
    
    return 0;
    
}