Sequence

ps:分段矩阵快速幂,因为P范围内只有√P段是不同的。写出的BUG:矩阵讲究左乘和右乘;取模较多可能会T,因为模运算很耗时;除法可能会除到0;只在3 ~ n的范围内分段,注意某段的端点是否大于n。

int temp[3][3] = {{0, 0, 0}, {1, 0, 0}, {0, 0, 1} };
node mTemp;

void Inite() {
    mTemp.A[0][0] = D;
    mTemp.A[0][1] = C;
    mTemp.A[0][2] = 0;
    for (int i = 1; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) mTemp.A[i][j] = temp[i][j];
    }
}

void solve() {
    node ans;
    for (int i = 0; i < 3; ++i) ans.A[i][i] = 1;
   // i 是左端点, y 是右端点
    Inite();
    for (int i = 3, x, y; i <= n; i = y + 1) {
        x = P / i;
        y = (x == 0 ? n : P / x);
        if (y > n) y = n; 
        mTemp.A[0][2] = x;
        ans = Fastpow(mTemp, y - i + 1) * ans;
    }
    ll res = ((ans.A[0][0] * (ll)B) % mod + (ans.A[0][1] * (ll)A) % mod + (ll)ans.A[0][2]) % mod;
    cout << res << endl;
}

 

posted @ 2018-08-14 12:43  天之道,利而不害  阅读(381)  评论(0编辑  收藏  举报