就是说:
f1 = x; f2 = y; 然后 f(i) = f(i-1) + f(i+1)
化简一下式子:
f(i+1) = f(i) - f(i-1)
用i 替换 i+1, 则
f(i) = f(i-1) - f(i-2) 这样就差不多可斐波那契的矩阵快速幂了 构造一个矩阵
就是很裸的矩阵快速幂了
注意取膜啊阿啊阿啊阿啊
#include <stdio.h>
typedef long long LL;
long long read(){
long long x = 0, f = 1;
char ch=getchar();
while(ch < '0' || ch > '9'){if(ch=='-') f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
const int maxn = 2;
const int mod = 1e9 + 7;
struct Matrix{
long long int m[maxn][maxn];
}unit;
Matrix operator * (Matrix a, Matrix b){
Matrix ret;
LL x;
int n = 2;
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
x = 0;
for(int k = 0; k < n; ++k){
x += (((LL)a.m[i][k] * b.m[k][j]) + mod ) % mod;
}
ret.m[i][j] = (x + mod) % mod;
}
}
return ret;
}
void init_unit(){
// 单位矩阵
for(int i = 0; i < maxn; ++i){
unit.m[i][i] = 1;
}
}
Matrix pow_mat(Matrix a, LL n){
Matrix ans = unit;
while (n) {
if(n & 1){
ans = ans * a;
}
a = a * a;
n >>= 1;
}
return ans;
}
int main(){
init_unit();
Matrix ans, a;
ans.m[0][0] = read();
ans.m[0][1] = read();
a.m[0][0] = 0; a.m[0][1] = -1;
a.m[1][0] = 1; a.m[1][1] = 1;
long long int n = read();
a = pow_mat(a, n - 1);
ans = ans * a;
printf("%lld\n", (ans.m[0][0] + mod )% mod);
return 0;
}