[P1306] 斐波那契公约数 (矩阵快速幂+斐波那契数列)

时间:2023-03-09 13:08:39
[P1306] 斐波那契公约数 (矩阵快速幂+斐波那契数列)

一开始数据没加强,一个简单的程序可以拿过

gcd(f[n],f[m])=f[gcd(n,m)]

下面这个是加强数据之后的80分代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
int main()
{
ll n,m,a=,b=,c=;cin>>n>>m;
for(ll i=;i<gcd(n,m);i++)
{
c=(a+b)%;
a=b;
b=c;//cout<<c%100000000<<endl;
}
cout<<c%;
return ;
}//1 1 2 3 5

最后一个点TLE,吸氧了之后还是过不了

因此是算法的问题

我这个蒟蒻不会优化,于是看了题解

题解给的是矩阵的优化

蒟蒻并不会这个算法

下面是神仙程序

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ymw 100000000
using namespace std;long long n,m;
struct node{long long a[][],r,c;};
inline node mul(node x,node y)//x*y的结果返回给z
{
node z;
memset(&z,,sizeof(z));
for(register int i=;i<x.r;i++)
for(register int j=;j<y.c;j++)
for(register int k=;k<x.c;k++)
z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j])%ymw;
z.r=x.r;z.c=y.c;
return z;
}
inline long long ksm(long long y)//快速幂加速递推
{
node x,ans;
memset(&x,,sizeof(x));
memset(&ans,,sizeof(ans));
x.r=x.c=ans.c=;
ans.r=;
x.a[][]=x.a[][]=x.a[][]=;
ans.a[][]=ans.a[][]=;
while(y)
{
if(y&) ans=mul(ans,x);
x=mul(x,x);
y>>=;
}
return ans.a[][];
}
signed main()
{
scanf("%lld%lld",&n,&m);
n=__gcd(n,m);//计算
if(n<) return putchar()&;//特判
printf("%lld",ksm(n-));//输出
}