#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 105;//矩阵最大阶数
const int MOD = 1e8;//对MOD取模
int n=2,k; //当前矩阵阶数,与k次幂
//定义矩阵结构体
struct Matrix{
int m[MAXN][MAXN];
//构造函数默认将矩阵初始化为0
Matrix(){memset(m,0,sizeof(m));}
Matrix(int n,initializer_list<int> a){
int r(1),v(1);
for(initializer_list<int>::iterator it = a.begin();it!=a.end();++it){
m[r][v] = *it;
if(++v > n){v=1,++r;}
}
}
//构造一个单位矩阵
void eye(){
for(int i=1;i<=n;++i)
m[i][i] = 1;
}
//输出矩阵
void output(){
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)
printf("%lld ",m[i][j]);
putchar('\n');
}
}
};
//重载 *操作符,使得矩阵结构体支持*操作
Matrix operator*(const Matrix & a,const Matrix & b){
Matrix ans;
//模拟矩阵相乘
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j]%MOD)%MOD;
return ans;
}
//矩阵快速幂
Matrix matrix_pow(Matrix a,int n){
Matrix res;
res.eye();//构造一个单位矩阵,等同于快速幂的 int res = 1; 的1
//与快速幂相同
while(n){
if(n&1) res = res *a ;
a = a * a;
n>>=1;
}
return res;
}
signed main(){
int a,b;
scanf("%lld %lld",&a,&b);
Matrix A(2,{1,1,1,0});
int gcd = __gcd(a,b);
if(gcd<=2) {cout<<1; return 0;}
Matrix ans = matrix_pow(A,gcd-2);
cout<<(ans.m[1][1]+ans.m[2][1])%MOD;
return 0;
}
矩阵快速幂
最新推荐文章于 2021-10-22 12:29:51 发布