gcd

更正:输出的顺序保证a<b

更正:输出样例:0 1000000006

/*
  斐波那契数列,步数为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;
}
View Code
原文地址:https://www.cnblogs.com/harden/p/5934978.html