萌新求助矩阵快速幂
查看原帖
萌新求助矩阵快速幂
107253
Water_Cows楼主2020/6/2 18:14

rt,30pts

#include <cstdio>
using namespace std;

typedef long long ll;

ll p, q, a1, a2, n, MOD;

struct Maxtic
{
    ll a[3][3];
}x;

inline void memset(Maxtic &h, ll aa, ll bb, ll cc, ll dd)
{
    h.a[1][1] = aa;
    h.a[1][2] = bb;
    h.a[2][1] = cc;
    h.a[2][2] = dd;
}

inline void print(Maxtic h)
{
    printf("%lld %lld\n%lld %lld\n", h.a[1][1], h.a[1][2], h.a[2][1], h.a[2][2]);
}

Maxtic operator * (Maxtic m, Maxtic n)
{
    Maxtic c;
    c.a[1][1] = c.a[1][2] = c.a[2][1] = c.a[2][2] = 0;

    for(int i=1; i<=2; i++)
    {
        for(int j=1; j<=2; j++)
        {
            for(int t=1; t<=2; t++)
            {
                c.a[i][j] = (c.a[i][j] + m.a[i][t] * n.a[t][j] % MOD) % MOD;
            }
        }
    }

    return c;
}

Maxtic doi1, doi2;

Maxtic Maxtimes(ll now)
{
    if(now == 1) return doi1;
    Maxtic t = Maxtimes(now / 2);
    
    t = t * t;

    if(now%2 == 1) t = t * doi1;

    return t;
}

int main()
{
    scanf("%lld%lld%lld%lld%lld%lld", &p, &q, &a1, &a2, &n, &MOD);

    MOD = 1e9 + 7; // 此话省略

    memset(doi1, p, 1, q, 0);
    memset(doi2, a1, a2, 0, 0);
    
    if(n == 1) 
    {
        printf("%lld", a1);
        return 0;
    }
    if(n == 2)
    {
        printf("%lld", a2);
        return 0;
    }

    Maxtic x = Maxtimes(n-2);

    printf("%lld\n", (x*doi2).a[1][1]);
}

hack数据:

in:

5 8 0 15 100 47

out:

2
2020/6/2 18:14
加载中...