错误信息:样例 1 正确,样例 2 输出的是 4,提交后只有 30 分(WA#6、#8,其余点 AC)
我已经检查和调试很久了,包括 是否开 long long、矩阵初始化、下标、模数等,但都没有找到问题。麻烦大佬们帮我指出一下细节,真的非常感谢!
代码如下:
#include <iostream>
#define int long long
#define mod 1000
using namespace std;
int f[3] = {0, 1}, b[3][3] = {{1, 1}, {1, 0}}; // f 是斐波那契数列,b 是用来计算 f 的矩阵
void mul(bool mode)
{
if (!mode)
{
int t1[3] = {};
for (int i = 0; i <= 1; i++) // 下标均从 0 开始
for (int k = 0; k <= 1; k++)
t1[i] = (t1[i] + f[k] * b[k][i]) % mod;
for (int i = 0; i <= 1; i++)
f[i] = t1[i];
}
else
{
int t2[3][3] = {};
for (int i = 0; i <= 1; i++)
for (int j = 0; j <= 1; j++)
for (int k = 0; k <= 1; k++)
t2[i][j] = (t2[i][j] + b[i][k] * b[k][j]) % mod;
for (int i = 0; i <= 1; i++)
for (int j = 0; j <= 1; j++)
b[i][j] = t2[i][j];
}
}
int fib(int n)
{
if (n <= 2) // 特判
return 1;
while (n)
{
if (n & 1)
{
mul(0); // f = f * b % mod
}
n >>= 1;
mul(1); // b = b * b % mod
}
return f[0] % mod;
}
int qpow(int x, int n)
{
int ans = 1;
while (n)
{
if (n & 1)
ans = ans * x % mod;
n >>= 1;
x = x * x % mod;
}
return ans % mod;
}
signed main()
{
int n, m, k;
cin >> n >> m >> k;
if (k == 1) // 特判
cout << n;
else if (k == 2)
cout << m;
else
cout << ((qpow(n, fib(k - 2)) % 10) * (qpow(m, fib(k - 1)) % 10)) % 10;
return 0;
}