题目描述 月月要参加学校的信息学集训,晚上不能陪华华聊天了。不过为了防止华华去和别的小姐姐聊天,浪费时间影响学习,所以月月给华华布置了一项任务。月月给了华华一个类似斐波那契数列的东西,这个数列满足: F_1=A,F_2=B,F_i=F_{i-1}+F_{i-2}(i>2)F 1 =A,F 2 =B,F i =F i−1 +F i−2 (i>2) 月月希望华华求出\gcd(F_N,F_{N+1})gcd(F N ,F N+1 )。月月认为,求这个东西需要很长的时间,所以华华就没有机会去和其他小姐姐聊天了。华华自然对月月十分忠诚,选择求出F的每一位后计算答案。但是比赛中的你看到这一题,就没必要那么老实了。现在给定A、B、N,请你求出月月要求的那个数字。答案可能很大,但是不取模。 输入描述: 输入一行三个正整数A,B,N。 输出描述: 输出一行一个正整数表示答案。 示例1 输入 2 4 5 输出 2用c++给我做
时间: 2024-03-24 07:39:25 浏览: 16
好的,这是一个比较简单的数学题,可以用矩阵快速幂求解。以下是 C++ 代码实现:
```c++
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 2;
const int MOD = 1e9 + 7;
struct Matrix {
LL m[MAXN][MAXN];
Matrix() { memset(m, 0, sizeof(m)); }
Matrix operator * (const Matrix& b) const {
Matrix c;
for (int i = 0; i < MAXN; ++i) {
for (int j = 0; j < MAXN; ++j) {
for (int k = 0; k < MAXN; ++k) {
c.m[i][j] = (c.m[i][j] + m[i][k] * b.m[k][j]) % MOD;
}
}
}
return c;
}
} base, res;
Matrix qpow(Matrix a, int b) {
Matrix ans;
for (int i = 0; i < MAXN; ++i) {
ans.m[i][i] = 1;
}
while (b) {
if (b & 1) {
ans = ans * a;
}
a = a * a;
b >>= 1;
}
return ans;
}
LL gcd(LL a, LL b) {
return b == 0 ? a : gcd(b, a % b);
}
int main() {
LL a, b, n;
cin >> a >> b >> n;
if (n == 1) {
cout << a << endl;
} else if (n == 2) {
cout << b << endl;
} else {
base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
res = qpow(base, n - 2);
LL ans = gcd(a * res.m[0][0] % MOD + b * res.m[1][0] % MOD, b * res.m[1][0] % MOD + b * res.m[1][1] % MOD);
cout << ans << endl;
}
return 0;
}
```
在这段代码中,我们定义了一个 `Matrix` 结构体,它表示一个 $2\times2$ 的矩阵。其中重载了 `*` 运算符,实现了矩阵乘法。
然后,我们定义了一个矩阵快速幂函数 `qpow`,用于求解矩阵的 $n$ 次方。
最后,在 `main` 函数中,我们通过快速幂求出矩阵 $base$ 的 $n-2$ 次方,然后根据题目要求求出 $\gcd(F_N, F_{N+1})$ 并输出即可。
需要注意的是,当 $n=1$ 或 $n=2$ 时,直接输出 $a$ 或 $b$ 即可。