hdu4565 矩阵构造+矩阵快速幂

第一眼看到就是矩阵快速幂,当然不能拿浮点数来快速幂了,要转化一下。
看到一些乱七八糟的推导,下面来个简单的


下面就直接快速幂就好了

//  Created by Chenhongwei on 2016-03-02 Wednesday 23:48
//  Copyright (c) 2016 Chenhongwei. All rights reserved.

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <sstream>
#include <algorithm>
#define root 1,n,1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int inf=1e9;
const int maxn=1e5+100;
typedef long long ll;
typedef unsigned long long ull;
struct matrix
{
	int x[2][2];
};
ll a,b,n,mod;
matrix mul(matrix &A,matrix &B)
{
	matrix C;
	for(int i=0;i<2;i++)
		for(int j=0;j<2;j++)
		{
			C.x[i][j]=0;
			for(int k=0;k<2;k++)
				C.x[i][j]=(C.x[i][j]+A.x[i][k]*B.x[k][j]%mod)%mod;
		}
	return C;
}
int main()
{
	//ios::sync_with_stdio(false);
    // freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	while(scanf("%lld%lld%lld%lld",&a,&b,&n,&mod)!=EOF)
	{
		matrix ans,t;
		for(int i=0;i<2;i++)
			for(int j=0;j<2;j++)i
				ans.x[i][j]=(i==j);
		t.x[0][0]=a%mod,t.x[0][1]=1;
		t.x[1][0]=b%mod,t.x[1][1]=a%mod;
		while(n)
		{
			if(n&1)
				ans=mul(ans,t);
			t=mul(t,t);
			n>>=1;
		}
		printf("%lld\n",(ans.x[0][0]*2)%mod);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值