矩阵快速幂+欧拉定理
#include<iostream>
#include<cstring>
using namespace std;
#define mod 1000000007
#define LL __int64
void Mul(LL a[2][2],LL b[2][2],LL c[2][2])//矩阵的乘法运算
{
int i,j,k;
LL sum;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
sum=0;
for(k=0;k<2;k++)
sum+=(a[i][k]*b[k][j])%(mod-1);
c[i][j]=sum%(mod-1);
}
}
void Pow(LL a[2][2],LL n)
{
if(n==1)
return ;
LL b[2][2],c[2][2];
memcpy(b,a,sizeof(b));
Pow(b,n/2);//n的最后一位是1,举个例子说明a^11101=a^( (1110*2) +1)=(a^1110)*(a^1110)*a
if(n&1)
{
Mul(b,a,c);
Mul(c,b,a);
}
else
Mul(b,b,a);
}
LL getsum(LL n)
{
LL a[2][2]={//初始化矩阵
{1,1},
{1,0}
};
if(n==0)
return 0;
else
{
Pow(a,n);
return a[0][1]%(mod-1);
}
}
LL pow(LL a,LL k)
{
if(k==1)
return a;
if(k==0)
return 1;
LL c=pow(a,k>>1);
if(k%2==0)
return c*c%mod;
else
return c*c%mod*a%mod;
}
int main()
{
LL a,b,n;
while(cin>>a>>b>>n)
{
if(n==0)
{
printf("%I64d\n",a%mod);
continue;
}
if(n==1)
{
printf("%I64d\n",b%mod);
continue;
}
printf("%I64d\n",(pow(a,getsum(n-1)) *pow(b,getsum(n)))%mod );
}
return 0;
}
本文介绍了一种结合矩阵快速幂与欧拉定理的算法实现方法,该方法主要用于高效解决特定类型的大整数指数运算问题。通过定义矩阵乘法运算、幂运算等关键函数,能够有效地进行大数计算。
778

被折叠的 条评论
为什么被折叠?



