全部评论 9

  • 99%内存,以赞

    2026-03-19 来自 广东

    2
  • 666

    2026-03-18 来自 浙江

    1
  • 666

    6天前 来自 河北

    0
  • 这总

    1周前 来自 广东

    0
  • #include <iostream>
    #include <vector>
    #include <unordered_map>
    using namespace std;
    typedef long long ll;

    ll p; // 全局模数,先声明

    struct Matrix {
    ll a[3][3];
    Matrix() {
    for (int i = 0; i < 3; ++i)
    for (int j = 0; j < 3; ++j)
    a[i][j] = 0;
    }
    Matrix operator*(const Matrix& other) const {
    Matrix res;
    for (int i = 0; i < 3; ++i)
    for (int k = 0; k < 3; ++k)
    if (a[i][k])
    for (int j = 0; j < 3; ++j)
    res.a[i][j] = (res.a[i][j] + a[i][k] * other.a[k][j]) % p;
    return res;
    }
    };

    Matrix mat_pow(Matrix base, ll exp) {
    Matrix res;
    for (int i = 0; i < 3; ++i) res.a[i][i] = 1;
    while (exp) {
    if (exp & 1) res = res * base;
    base = base * base;
    exp >>= 1;
    }
    return res;
    }

    int main() {
    ll n, k;
    cin >> n >> k >> p;
    if (n == 1 || n == 2) {
    cout << 1 % p << endl;
    return 0;
    }

    // 状态:(prev_modk, cur_modk) -> 首次出现的月份(cur 对应的月份)
    unordered_map<ll, ll> state_map;
    vector<ll> month_fp;   // 每月的模 p 值,下标从 1 开始
    vector<ll> month_delta; // 每月的 delta(从第 3 个月开始,存 delta_i)
    month_fp.push_back(0); // 占位
    month_fp.push_back(1 % p);
    month_fp.push_back(1 % p);
    month_delta.push_back(0); // 占位
    month_delta.push_back(0);
    month_delta.push_back(0);
    
    ll a_k = 1, b_k = 1;   // 前两个月的模 k 值
    ll a_p = 1 % p, b_p = 1 % p;
    ll cur_month = 2;
    state_map[1 * k + 1] = 2;
    
    ll start = -1, cycle_len = -1;
    
    while (true) {
        cur_month++;
        ll sum_k = (a_k + b_k) % k;
        ll delta = (sum_k == 1) ? 1 : 0;
        ll c_k = (sum_k - delta + k) % k;
        ll c_p = (a_p + b_p - delta) % p;
        if (c_p < 0) c_p += p;
    
        month_fp.push_back(c_p);
        month_delta.push_back(delta);
    
        ll state = b_k * k + c_k;
        auto it = state_map.find(state);
        if (it != state_map.end()) {
            start = it->second;
    

    1周前 来自 广东

    0
  • 2026-06-05 来自 北京

    0
  • 666

    2026-04-15 来自 浙江

    0
  • nb

    2026-03-31 来自 四川

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页