gcd
更正:输出的顺序保证a<b
更正:输出样例:0 1000000006
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* 斐波那契数列,步数为1的时候特判一下 a<b 输出,真不知道题目想干什么,a是模之后的还是模之前的 */ #include<cstdio> #include<iostream> #define mod 1000000007 #define ll long long using namespace std; ll b[3][3],c[3][3],ans[3][3]; void work(ll n) { b[1][1]=ans[1][1]=0; b[1][2]=ans[1][2]=1; b[2][1]=ans[2][1]=1; b[2][2]=ans[2][2]=1; while(n) { if(n&1) { for(int k=1;k<=2;k++) for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) c[i][j]=(c[i][j]+(ans[i][k]%mod*b[k][j]% mod))%mod; for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) ans[i][j]=c[i][j],c[i][j]=0; } for(int k=1;k<=2;k++) for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) c[i][j]=(c[i][j]+(b[i][k]%mod*b[k][j]%mod))% mod; for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) b[i][j]=c[i][j],c[i][j]=0; n/=2; } ll ans1=(ans[1][2])%mod,ans2=(ans[1][1]+ans[1][2])%mod; cout<<min(ans1,ans2)<<" "<<max(ans1,ans2); } int main() { //freopen("jh.in","r",stdin); freopen("gcd.in","r",stdin); freopen("gcd.out","w",stdout); ll n; cin>>n; work(n); return 0; }