【矩阵快速幂】CF gym 101473 H Buses

38 篇文章 0 订阅


http://codeforces.com/gym/101473   H buses

#include <bits/stdc++.h>
using namespace std;

const long long mod = 1e6;

struct M
{
	long long a[2][2];
};

M multi(const M& x, const M& y) //矩阵乘法
{
	M z;
	for(int i = 0; i < 2; i ++) {
	  for(int j = 0; j < 2; j ++) {
		z.a[i][j] = 0;
		for(int k = 0; k < 2; k ++) {
		  long long hx = x.a[i][k] % mod;
		  long long hy = y.a[k][j] % mod;
		  long long tmp = hx * hy % mod;
		  z.a[i][j] = (z.a[i][j] + tmp) % mod;
		}
	  }
	}
	return z;
}

M qpow(long long n, long long A, long long B)  //快速幂
{
	M ans;
	ans.a[0][0] = 1, ans.a[0][1] = 0;
	ans.a[1][0] = 0, ans.a[1][1] = 1;
	
	M t;
	t.a[0][0] = A, t.a[0][1] = B;
	t.a[1][0] = 1, t.a[1][1] = 0;

	while (n)  //快速幂
	{
		if (n & 1) //这位上为1 ans*=t;
			ans = multi(ans, t);

		t = multi(t, t); //t自身平方
		n >>= 1;
	}
	return ans;
}

int main()
{
	long long n, A, B;
	scanf("%lld%lld%lld", &n, &A, &B);
	
	//f[i] = A * f[i - 5] + B * f[i - 10]

	//构造矩阵  矩阵快速幂加速
	// | A B | *  | f[i-5]   0|  =   | f[i]    0 |
	// | 1 0 |    | f[i-10]  0|      | f[i-5]  0 |

	// 矩阵自身相乘(n/5-1)次
	
	M u = qpow(n / 5 - 1, A, B);
	
	M v;   //初始值
	v.a[0][0] = A, v.a[0][1] = 0;
	v.a[1][0] = 1, v.a[1][1] = 0;

	M w = multi(u, v);
	printf("%06lld\n", w.a[0][0]);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值