HDU 4565 So Easy!

题目地址点击打开链接


代码如下

#include <cstdio>
#include <cstring>

using namespace std;

__int64 a, b, n, m;

struct Matrix{
	int column;
	int row;
	__int64 a[3][3];
	void clear()
	{
		column = row = 0;
		memset(a, 0, sizeof(a));
	}
	Matrix operator * (const Matrix& B) const
	{
		Matrix C;
		C.clear();
		C.row = row;
		C.column = B.column;
		for (int i = 0; i < C.row; ++i)
			for (int j = 0; j < C.column; ++j)
				for (int k = 0; k < column; ++k)
					C.a[i][j] = ((C.a[i][j] + a[i][k] * B.a[k][j]) % m + m)%m ;
		return C;
	}
};
Matrix mat_pow(Matrix A, __int64 pow_n)
{
	Matrix C;
	C.clear();
	C.column = C.row = A.column;
	for (int i = 0; i < C.column; ++i)
		C.a[i][i] = 1;
	while (pow_n)
	{
		if (pow_n & 1)
			C = C * A;
		A = A * A;
		pow_n >>= 1;
	}
	return C;
}

Matrix A, B, C;
int main(void)
{
	while (scanf("%I64d%I64d%I64d%I64d", &a, &b, &n, &m) != EOF)
	{
		A.clear();
		B.clear();
		C.clear();
		A.column = A.row = 2;
		A.a[0][0] = 2 * a;
		A.a[0][1] = b - a * a;
		A.a[1][0] = 1;
		A.a[1][1] = 0;
		B = mat_pow(A, n - 1);
		C.row = 2;
		C.column = 1;
		C.a[0][0] = 2 * a;
		C.a[1][0] = 2;
		B = B * C;
		printf("%I64d\n", B.a[0][0]);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值