记录编号 |
283064 |
评测结果 |
AAAAAAAAAA |
题目名称 |
斐波那契平方和 |
最终得分 |
100 |
用户昵称 |
洛克索耶夫 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.029 s |
提交时间 |
2016-07-14 07:54:50 |
内存使用 |
0.32 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
unsigned long long n, p;
struct Matrix{
unsigned long long n, m, a[5][5];//琛 鍒
void clear()
{
n = m = 0;
memset(a, 0, sizeof(a));
}
Matrix operator * (const Matrix& x) const {//鐭╅樀涔樻硶
Matrix tmp;
tmp.clear();
tmp.n = n;
tmp.m = x.m;
for(int i = 1; i <= tmp.n; i++){
for(int j = 1; j <= tmp.m; j++){
for(int k = 1; k <= m; k++){
tmp.a[i][j] += a[i][k] * x.a[k][j];
tmp.a[i][j] %= 1000000007;
}
}
}
return tmp;
}
Matrix operator + (const Matrix& x) const {//鐭╅樀鍔犳硶
Matrix tmp;
tmp.clear();
for(int i = 0; i <= n; i++)
for(int j = 0; j <= m; j++)
tmp.a[i][j] = a[i][j] + x.a[i][j];
return tmp;
}
};
int main()
{
freopen("fibsqr.in", "r", stdin);freopen("fibsqr.out", "w", stdout);
scanf("%llu", &n);
if(n == 0){
puts("0");
return 0;
}
Matrix first, x;
first.clear(); x.clear();
first.n = 1; first.m = 2;
first.a[1][1] = 1, first.a[1][2] = 0;
x.n = 2; x.m = 2;
x.a[1][1] = 1; x.a[1][2] = 1; x.a[2][1] = 1; x.a[2][2] = 0;
for(unsigned long long i = 1; i <= n; i <<= 1, x = x * x){
if(n & i) first = first * x;
}
printf("%llu\n", first.a[1][1]%1000000007 * first.a[1][2]%1000000007);
//printf("%lf", (double)clock()/CLOCKS_PER_SEC);
//system("pause");
fclose(stdin);
fclose(stdout);
return 0;
}