题意:给一个函数满足以下方程:
给出f1和f2,需要求出fn的值
思路:方程可以变为fi+1 = fi - fi-1
,这样就能求出递推式:(fi,fi+1)T = (0,1;-1,1)(fi-1,fi)T,之后求常量矩阵的n-2次幂再乘上(f1,f2)T即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 50+10;
const int inf = 0x3f3f3f3f;
int n, m, T, s[maxn][maxn], x[maxn][maxn], temp[maxn][maxn];
void mul(int a[maxn][maxn], int b[maxn][maxn])
{
memset(temp, 0, sizeof(temp));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
temp[i][j] = temp[i][j]%m + a[i][k]*b[k][j]%m;
memcpy(a, temp, sizeof(temp));
}
void pow_mod(int a[maxn][maxn], int k)
{
int t[maxn][maxn];
memcpy(t, a, sizeof(t));
while (k) {
if (k&1) mul(t, a);
mul(a, a);
k >>= 1;
}
memcpy(a, t, sizeof(t));
}
int main()
{
memset(s, 0, sizeof(s));
memset(x, 0, sizeof(x));
cin >> s[0][0] >> s[1][0] >> T;
n = 4, m = 1e9+7;
if (T <= 2) {
if (s[T-1][0] < 0)
s[T-1][0] += m;
cout << s[T-1][0]%m << "\n";
return 0;
}
x[0][0] = 0, x[0][1] = 1, x[1][0] = -1, x[1][1] = 1;
pow_mod(x, T-3);
mul(x, s);
if (x[1][0] < 0)
x[1][0] += m;
cout << x[1][0]%m << "\n";
return 0;
}