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;
    }

  • 相关阅读:
    axis2依赖的其他jar, 版本不是最新的
    mysql: 安装后的目录结构
    视图的使用
    索引
    递归查询 start with connect by prior
    oracle创建表
    C#中 ??、 ?、 ?: 、?.、?[ ] 和$
    C#关键字static、virtual和abstract笔记
    js调用后台,后台调用前台等方法总结
    java基础序列化
  • 原文地址:https://www.cnblogs.com/liudehao/p/4148369.html
Copyright © 2011-2022 走看看