这个题一眼就看出来让a+b最小,起始地矩阵应该是(0,1),这样就最小了,然后辗转相除k次,每次贪心加小的,加他自己是最小的,因为设a,b,a%b,比a%b大的最小的且%b=a%b的,是a%b+b,(1,0+1)就成了两项的和,这不是斐波那契亚数列吗
用矩阵快速米搞
#include<cstdio>
#include<iostream>
#define p 1000000007
#define ll long long
using namespace std;
ll k;
struct st{
ll a[2][2];
inline st operator *(const st &b)const{
st ans;
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++)
{
ans.a[i][j]=0;
for(int k=0;k<=1;k++)
(ans.a[i][j]+=(1ll*a[i][k]*b.a[k][j])%p)%=p;
}
return ans;
}
};
st a;
st ans;
st fastpow(ll k){
ans.a[0][0]=0,ans.a[0][1]=1,ans.a[1][0]=1,ans.a[1][1]=1;a=ans;
while(k){
if(k&1) ans=ans*a;
a=a*a;
k/=2;
}
return ans;
}
int main(){
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
scanf("%lld",&k);
ans=fastpow(k+1);
if(k==1) printf("1 1");
else
printf("%lld %lld\n",ans.a[0][0],ans.a[0][1]);
}