矩阵快速幂 poj 3070

本文介绍了快速幂算法的具体实现过程,并提供了两种不同的C++代码实现方式。通过对算法的讲解及示例代码的展示,帮助读者更好地理解和掌握快速幂算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

poj 3070

点击打开链接

按照快速幂是思路

int  pow4( int  a, int  b){
   int  r=1,base=a;
   while (b){
     if (b&1) r*=base;
     base*=base;
     b>>=1;
   }
   return  r;
}
并且通过学长,理解了b>>1(本质上是个bool值)和b>>=1的区别;
代码如下
第一种
#include<cstdio>
#include<iostream> 
#include<cstring>
using namespace std;
const int Mod=10000;
int fast_mod(int n){
	int r[2][2]={1,0,0,1};
	int base[2][2]={1,1,1,0};
	while(n){
		int t[2][2];
		if(n&1){
			for(int i=0;i<2;i++)
				for(int j=0;j<2;j++)
					t[i][j]=r[i][j];
			memset(r,0,sizeof(r));
			for(int i=0;i<2;i++)
			{
				for(int j=0;j<2;j++)
				{
					for(int k=0;k<2;k++)
					{
						r[i][j]=(r[i][j]+t[i][k]*base[k][j])%Mod;
					}
				 } 
			}
		}
		for(int i=0;i<2;i++)
				for(int j=0;j<2;j++)
					t[i][j]=base[i][j];
			memset(base,0,sizeof(base));
			for(int i=0;i<2;i++)
			{
				for(int j=0;j<2;j++)
				{
					for(int k=0;k<2;k++)
					{
						base[i][j]=(base[i][j]+t[i][k]*t[k][j])%Mod;
					}
				 } 
			}
		n>>=1;
	}
	return r[0][1];
}
int main()
{
	int n;
	while(~scanf("%d",&n)&&n!=-1){
		printf("%d\n",fast_mod(n));
		
	}
	return 0;
}
第二种
#include<cstdio>
#include<iostream> 
#include<cstring>
using namespace std;
const int Mod=10000;
struct matrix
{
	int m[2][2];
}r,base;
matrix multiply(matrix a,matrix b)
{
	matrix t;
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<2;j++)
		{
			t.m[i][j]=0;
			for(int k=0;k<2;k++)
				t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%Mod;
		}
	}
	return t;
	
}
int fast_mod(int n){
	r.m[0][0]=1; r.m[0][1]=0; r.m[1][0]=0; r.m[1][1]=01;
	base.m[0][0]=1; base.m[0][1]=1; base.m[1][0]=1; base.m[1][1]=0;
	while(n){
		if(n&1){
			r=multiply(r,base);
		}
		base=multiply(base,base);
		n>>=1;
	}
	return r.m[0][1];
	
}
int main()
{
	int n;
	while(~scanf("%d",&n)&&n!=-1){
		printf("%d\n",fast_mod(n));
		
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值