记录编号 |
582700 |
评测结果 |
AAAAAAAAAA |
题目名称 |
加强斐波那契数列 |
最终得分 |
100 |
用户昵称 |
┭┮﹏┭┮ |
是否通过 |
通过 |
代码语言 |
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;
}