首页 > 其他 > 详细

P1337 fibonacci数列(tyvj)

时间:2016-02-19 12:05:54      阅读:215      评论:0      收藏:0      [点我收藏+]

 

http://www.tyvj.cn/p/1337

时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

著名的斐波那契数列
f[n]=1               n=1,2
     f[n-1]+f[n-2]   n>2
现在求第n项,由于f[n]可能很大,你只需要输出mod 32768的值即可。

输入格式

仅有一行,为n,1<=n<=maxlongint

输出格式

仅有一个数字,即答案

测试样例1

输入

3

输出

2

备注

各个测试点1s
 
 
/*
  根据分析可以得到ans{f(n-1),f(n)}*k{0,1}=ans{f(n),f(n+1)}
                             {1,1}  
  那么由ans{f(1),f(2)}到ans{f(n-1),f(n)},需乘以n-1个k矩阵,这是可以应用快速幂求的 
*/ 


#include<cstdio>
#include<iostream>
#define m 32768
#define N 2
using namespace std;

struct mat
{
    int num[N][N];
}k,ans;
int n;

mat work(mat a,mat b)//矩阵乘法 
{
    mat temp;
    for (int i=0;i<N;i++)
      for (int j=0;j<N;j++)
        temp.num[i][j]=0;
    for (int i=0;i<N;i++)
      for (int j=0;j<N;j++)
      {
        for (int h=0;h<N;h++)
          temp.num[i][j]+=a.num[i][h]*b.num[j][h];
          temp.num[i][j]%=m;
      }
    return temp;
}

void power()//快速幂 
{
    while (n!=0)
      {
           if (n%2==1) ans=work(ans,k);
           k=work(k,k);
           n/=2;
      }
}


int main()
{
    scanf("%d",&n);
    n=n-2;
    k.num[0][0]=0;
    k.num[0][1]=k.num[1][0]=k.num[1][1]=1;
    ans.num[0][0]=ans.num[0][1]=1;
    ans.num[1][0]=ans.num[1][1]=0;
    power();
    printf("%d",ans.num[0][1]);
}

 

 

 

P1337 fibonacci数列(tyvj)

原文:http://www.cnblogs.com/sjymj/p/5200191.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!