zoukankan      html  css  js  c++  java
  • POJ-3070-Fibonacci

    题目链接

    http://poj.org/problem?id=3070

    刚刚学了矩阵,自己写了个Fibonacci ,这题看了一下输入输出,直接贴上代码,就AC了。矩阵真是个好方法。

    代码

    #include<stdio.h>
    #include<string.h>
    #define mod 10000

    __int64 a[5];
    __int64 b[3][3];

    __int64 quick_mod(__int64 n)
    {
    __int64 i,j,k;
    a[1]=1; a[2]=1;
    b[1][1]=0; b[1][2]=1;
    b[2][1]=1; b[2][2]=1;
    while(n)
    {
    if(n&1)
    {
    __int64 s[3];
    memset(s,0,sizeof(s));
    for(i=1;i<=2;i++)
    {
    for(j=1;j<=2;j++)
    {
    s[i]=(s[i]+a[j]*b[j][i])%mod;
    }
    }
    for(i=1;i<=2;i++)
    a[i]=s[i];
    n--;
    }
    n=n/2;
    __int64 kk[5][5];
    memset(kk,0,sizeof(kk));
    for(i=1;i<=2;i++)
    {
    for(j=1;j<=2;j++)
    {
    for(k=1;k<=2;k++)
    {
    kk[i][j]=(kk[i][j]+b[i][k]*b[k][j])%mod;
    }
    }
    }
    for(i=1;i<=2;i++)
    {
    for(j=1;j<=2;j++)
    {
    b[i][j]=kk[i][j];
    }
    }
    }
    return a[1];
    }

    int main(void)
    {
    __int64 n;
    while(scanf("%I64d",&n)==1)
    {
    if(n==-1)
    return 0;
    if(n==0)
    {
    printf("0 ");
    continue;
    }
    printf("%I64d ",quick_mod(n-1));
    }
    return 0;
    }

    用题目的方法也可以

    代码

    #include<stdio.h>
    #include<string.h>
    #define mod 10000

    __int64 a[3][3],b[3][3];

    __int64 quick_mod(__int64 n)
    {
    __int64 i,j,k;
    __int64 kk[3][3];
    a[1][1]=1; a[1][2]=1;
    a[2][1]=1; a[2][2]=0;
    b[1][1]=1; b[1][2]=1;
    b[2][1]=1; b[2][2]=0;
    while(n)
    {
    if(n&1)
    {
    memset(kk,0,sizeof(kk));
    for(i=1;i<=2;i++)
    {
    for(j=1;j<=2;j++)
    {
    for(k=1;k<=2;k++)
    {
    kk[i][j]=(kk[i][j]+a[i][k]*b[k][j])%mod;
    }
    }
    }
    for(i=1;i<=2;i++)
    {
    for(j=1;j<=2;j++)
    {
    a[i][j]=kk[i][j];
    }
    }
    n--;
    }
    n=n/2;
    memset(kk,0,sizeof(kk));
    for(i=1;i<=2;i++)
    {
    for(j=1;j<=2;j++)
    {
    for(k=1;k<=2;k++)
    {
    kk[i][j]=(kk[i][j]+b[i][k]*b[k][j])%mod;
    }
    }
    }
    for(i=1;i<=2;i++)
    {
    for(j=1;j<=2;j++)
    {
    b[i][j]=kk[i][j];
    }
    }
    }
    return a[1][2];
    }

    int main(void)
    {
    __int64 i,j,k,k1,k2,n;
    while(scanf("%I64d",&n)==1)
    {
    if(n==-1) return 0;
    if(n==0)
    {
    printf("0 ");
    continue;
    }
    printf("%I64d ",quick_mod(n-1));
    }
    return 0;
    }

  • 相关阅读:
    【转】探秘Java中的String、StringBuilder以及StringBuffer
    【转】深入剖析Java中的装箱和拆箱
    谈谈我对多态的理解
    mysql组合索引之最左原则
    白衣浅谈各个集合的特性
    Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比
    内网穿透工具的原理与开发实战
    nohup命令说明-转载
    springboot 启动jar正确方式
    maven版本仲裁原则
  • 原文地址:https://www.cnblogs.com/liudehao/p/4148369.html
Copyright © 2011-2022 走看看