矩阵快速幂取模--cf678d Iterated linear function

所有线性变换可由矩阵表示。

#include <iostream>

using namespace std;

const int mod = 1e9 + 7;

struct matrix{

    long long m[2][2];

};


long long a,b,n,x;

matrix multiple(matrix a,matrix b)

{

    matrix ans;

    ans.m[0][0] = 0,ans.m[0][1] = 0,ans.m[1][0] = 0,ans.m[1][1] = 0;

    for (int i = 0; i < 2; i ++) {

        for (int j = 0; j < 2; j ++) {

            for (int k = 0; k < 2; k ++) {

                ans.m[i][j] = (ans.m[i][j] % mod + a.m[i][k] %mod * b.m[k][j] % mod) % mod;

            }

        }

    }

    return ans;

}

matrix quick(long long n)//n - 1次幂

{

    matrix co;

    co.m[0][0] = a + 1,co.m[0][1] = -a,co.m[1][0] = 1,co.m[1][1] = 0;

    matrix res;

    res.m[0][0] = 1,res.m[0][1] = 0,res.m[1][0] = 0,res.m[1][1] = 1;

    n --;

    while (n) {

        if (n & 1) {

            res = multiple(res,co);

        }

        co = multiple(co, co);

        n >>= 1;

    }

    return res;

}

int main()

{

    cin >> a >> b >> n >> x;

    quick(n);

    long long tmp = (a % mod * x % mod + b) % mod;

    if (n == 1) {

        cout << tmp << endl;

    }

    else if(n == 0) cout << x  << endl;

    else {

        matrix res = quick(n);

        tmp = tmp % mod * res.m[0][0] % mod ;

        tmp = tmp % mod + res.m[0][1] % mod * x % mod + mod;

        cout << (tmp % mod + mod ) % mod << endl;

    }

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值