zoukankan      html  css  js  c++  java
  • hdu3117 fibonacci+矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3117

    求fibonacci数列第n项,如果位数超过八位就求它的前四位和后四位,在此我们知道求后四位是非常简单的,只需要快速幂取模就可以,但是取前四位就需要经过一些操作,证明过程如下。最后为了防止后四位中前面是0,对printf函数参数进行修改。

     代码如下:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef unsigned int ui;
     4 typedef long long ll;
     5 typedef unsigned long long ull;
     6 #define pf printf
     7 #define mem(a,b) memset(a,b,sizeof(a))
     8 #define prime1 1e9+7
     9 #define prime2 1e9+9
    10 #define pi 3.14159265
    11 #define lson l,mid,rt<<1
    12 #define rson mid+1,r,rt<<1|1
    13 #define scand(x) scanf("%llf",&x) 
    14 #define f(i,a,b) for(int i=a;i<=b;i++)
    15 #define scan(a) scanf("%d",&a)
    16 #define mp(a,b) make_pair((a),(b))
    17 #define P pair<int,int>
    18 #define dbg(args) cout<<#args<<":"<<args<<endl;
    19 #define inf 0x7ffffff
    20 inline int read(){
    21     int ans=0,w=1;
    22     char ch=getchar();
    23     while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    24     while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    25     return ans*w;
    26 }
    27 int n,m,t;
    28 const int maxn=1e5+10;
    29 const ll mod=10000;
    30 struct matrix{
    31     ll a[3][3];
    32     matrix operator * (const matrix &x) const
    33     {
    34         matrix c;
    35         f(i,1,2)
    36             f(j,1,2)
    37                 f(k,1,2)
    38                 {
    39                     c.a[i][j]=(c.a[i][j]+a[i][k]*x.a[k][j])%mod;
    40                 }
    41                 
    42                 return c;
    43     }
    44     matrix(){
    45         a[1][1]=a[1][2]=a[2][1]=a[2][2]=0;
    46     }
    47 };
    48 matrix pow(matrix A,int k)
    49 {
    50     matrix ans;
    51     ans.a[1][1]=ans.a[2][2]=1;
    52     ans.a[1][2]=ans.a[2][1]=0;
    53     while(k)
    54     {
    55         if(k&1)ans=ans*A;
    56         k>>=1;
    57         A=A*A;
    58     }
    59     return ans;
    60 }
    61 ll a[100];
    62 int main()
    63 {
    64     //freopen("input.txt","r",stdin);
    65     //freopen("output.txt","w",stdout);
    66     std::ios::sync_with_stdio(false);
    67     matrix A;
    68     A.a[1][1]=A.a[1][2]=A.a[2][1]=1;A.a[2][2]=0;
    69     a[0]=0;a[1]=1;
    70     int pivot=0;
    71     f(i,2,100)
    72     {
    73         a[i]=a[i-1]+a[i-2];
    74         if(a[i]>=100000000)
    75         {
    76             pivot=i-1;//最后一个八位数 
    77             break;
    78         }
    79     }
    80     while(~scanf("%d",&n))
    81     {
    82         if(n<=pivot)
    83         {
    84             pf("%d
    ",a[n]);
    85             continue;
    86         }
    87         else
    88         {
    89             matrix tmp=pow(A,n-1);
    90             ll last=tmp.a[1][1];
    91             double lgs=log10(1.0/sqrt(5))+(double)n*log10((1.0+sqrt(5))/2.0);
    92             int d=(int)(pow(10,lgs-(int)lgs+3));//计算前四位 
    93             pf("%d...%04lld
    ",d,last) ;//后四位开头如果是0的话就需要补全 
    94          } 
    95     }
    96 } 
  • 相关阅读:
    Docker安装和基本操作
    Docker安装和基本操作
    程序员让计算机替自己完成工作,老板该不该解雇他?
    程序员让计算机替自己完成工作,老板该不该解雇他?
    程序员让计算机替自己完成工作,老板该不该解雇他?
    程序员让计算机替自己完成工作,老板该不该解雇他?
    apache与tomcat负载集群的3种方法
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12725813.html
Copyright © 2011-2022 走看看