求调, WA at #8,疑似longlong溢出
查看原帖
求调, WA at #8,疑似longlong溢出
109944
Allenyou1126楼主2023/10/26 20:25
#include <cstdio>
using namespace std;
inline long long rd() {
    long long ret = 0, flag = 1;
    char c = getchar();
    for (; c > '9' || c < '0'; c = getchar())
        if (c == '-')
            flag = -1;
    for (; c >= '0' && c <= '9'; c = getchar())
        ret = ret * 10 + (c - '0');
    return ret * flag;
}
long long mod, k, n;
long long initial[3], a[3][3], ret[3][3];
long long tmp[3][3];
int main() {
    mod = rd();
    k = rd();
    n = rd();
    long long p1 = k, p2 = (k * k - 2) % mod;
    long long p3 = (((k * p2) % mod) - p1) % mod;
    if (n == 0) {
        printf("2\n");
        return 0;
    }
    if (n == 1) {
        printf("%lld\n", p1);
        return 0;
    }
    if (n == 2) {
        printf("%lld\n", p2);
        return 0;
    }
    if (n == 3) {
        printf("%lld\n", p3);
        return 0;
    }
    initial[0] = p3;
    initial[1] = p2;
    initial[2] = p1;
    a[0][0] = k;
    a[1][0] = -1;
    a[0][1] = 1;
    a[1][2] = 1;
    ret[0][0] = k;
    ret[1][0] = -1;
    ret[0][1] = 1;
    ret[1][2] = 1;
    n -= 4;
    while (n) {
        if (n & 1) {
            for (int i = 0; i < 3; ++i) {
                for (int j = 0; j < 3; ++j) {
                    tmp[i][j] = 0ll;
                    for (int k = 0; k < 3; ++k) {
                        tmp[i][j] = (tmp[i][j] + (((__int128_t)a[k][j] * ret[i][k]) % mod)) % mod;
                    }
                }
            }
            for (int i = 0; i < 3; ++i) {
                for (int j = 0; j < 3; ++j) {
                    ret[i][j] = tmp[i][j];
                }
            }
        }
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                tmp[i][j] = 0ll;
                for (int k = 0; k < 3; ++k) {
                    tmp[i][j] = (tmp[i][j] + (((__int128_t)a[k][j] * a[i][k]) % mod)) % mod;
                }
            }
        }
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                a[i][j] = tmp[i][j];
            }
        }
        n >>= 1;
    }
    long long ans = 0ll;
    for (int i = 0; i < 3; ++i) {
        ans = (ans + (((__int128_t)initial[i] * ret[i][0]) % mod)) % mod;
    }
    printf("%lld\n", ans);
    return 0;
}
2023/10/26 20:25
加载中...