求助!矩阵快速幂 WA#6#8
查看原帖
求助!矩阵快速幂 WA#6#8
924249
OIerZhang楼主2024/8/4 19:47

错误信息:样例 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;
}
2024/8/4 19:47
加载中...