zoukankan      html  css  js  c++  java
  • P1306斐波那契公约数(数论)待弄懂

    结论gcd(f(n),f(m))=f(gcd(n,m));

    证明是真的难懂,等我数论上路不知能否看懂,立个flag

    因为比较的大,所以要用到矩阵快速幂求斐波那契数列

     1 #include<iostream>
     2 #define ll long long
     3 using namespace std;
     4 struct matix
     5 {
     6     ll m[2][2];
     7 }mp;
     8 const int mod = 1e8;
     9 matix mul(matix a,matix b)//矩阵乘法
    10 {
    11     matix t;//answer
    12     for(ll i=0;i<=1;i++)
    13     {
    14         for(ll j=0;j<=1;j++)
    15         {
    16             t.m[i][j]=0;
    17         }
    18     }
    19     for(ll i=0;i<=1;i++)//普通的矩阵乘法
    20     {
    21         for(ll j=0;j<=1;j++)
    22         {
    23             for(ll k=0;k<=1;k++)
    24             {
    25                 t.m[i][j]+=(a.m[i][k]%mod*b.m[j][k]%mod)%mod;
    26                 t.m[i][j]%=mod;
    27             }
    28         }
    29     }
    30     return t;
    31 }
    32 void cal(ll n)
    33 {
    34     matix t;
    35     t.m[0][0]=t.m[1][0]=t.m[0][1]=1;
    36     t.m[1][1]=0;
    37     for(ll i=0;i<=1;i++)
    38     {
    39         for(ll j=0;j<=1;j++)
    40         {
    41             if(i==j)
    42             {
    43                 mp.m[i][j]=1;
    44             }
    45             else
    46             {
    47                 mp.m[i][j]=0;
    48             }
    49         }
    50     }
    51     //在此之前的是初始化
    52     while(n)//一般快速幂,(矩阵快速幂就是把乘变成了矩阵乘法)
    53     {
    54         if(n&1)
    55         {
    56             mp=mul(t,mp);
    57         }
    58         n>>=1;
    59         t=mul(t,t);
    60     }
    61 }
    62 ll gcd(ll a,ll b)//计算最大公约数,辗转相除
    63 {
    64     while(b)
    65     {
    66         ll Rem = a % b;
    67         a = b;
    68         b = Rem;
    69     }
    70     return a;
    71 }
    72 int main()
    73 {
    74     ll n,m;
    75     cin>>n>>m;
    76     int t=gcd(n,m);
    77     cal(t-1);//计算f(t)
    78     cout<<mp.m[0][0];
    79     return 0;
    80 }
  • 相关阅读:
    js触摸屏案例
    Docker
    Docker 镜像加速
    Docker 命令大全
    linux gpasswd
    Docker基础教程
    PHP输出毫秒时间戳
    PHP Variable handling 函数
    Partition Array by Odd and Even
    Median
  • 原文地址:https://www.cnblogs.com/greenofyu/p/12215658.html
Copyright © 2011-2022 走看看