95pts, wa#1求助
查看原帖
95pts, wa#1求助
767099
WEXI7111楼主2022/12/30 23:15
#include<bits/stdc++.h>
#define ll __int128
using namespace std;
ll p;

void mul(ll f[3], ll A[3][3])
{
    ll c[3]; memset(c, 0, sizeof(c));
    for(int i = 0; i < 3; i ++)
        for(int k = 0; k < 3; k ++)
            c[i] = (c[i] + f[k] * A[k][i] % p) % p;
    memcpy(f, c, sizeof(c));
}

void squ(ll A[3][3])
{
    ll c[3][3]; memset(c, 0, sizeof(c));
    for(int i = 0; i < 3; i ++)
        for(int j = 0; j < 3; j ++)
            for(int k = 0; k < 3; k ++)
                c[i][j] = (c[i][j] + A[i][k] * A[k][j] % p) % p;
    memcpy(A, c, sizeof(c));
}

int main()
{
    ll n, a, b, c;
    long long nn, aa, bb, cc, pp;
    scanf("%lld%lld%lld%lld%lld", &nn, &aa, &bb, &cc, &pp);
    n = nn, a = aa, b = bb, c = cc, p = pp;
    n --;
    ll f[3] = {1, 1, c};
    ll A[3][3] = {{a + b, 0, 0}, {b, a + b, 0}, {1, 0, 1}};
    for(; n > 0; n >>= 1)
    {
        if(n & 1) mul(f, A);
        squ(A); 
    }
    cout << (long long)f[0];
    return 0;
}
2022/12/30 23:15
加载中...