程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU3306Another kind of Fibonacci(簡單矩陣快速冪)

HDU3306Another kind of Fibonacci(簡單矩陣快速冪)

編輯:C++入門知識

哎,本來是想學學矩陣構造的方法的,,突然發現自己不用看直接就會yy構造。。。

看下右邊有什麼。。


題目地址:Another kind of Fibonacci


AC代碼:

#include
#include
#include
#include
using namespace std;
const int mod=10007;

int p[4][4],a[4][4],tmp[4][4];
int n,x,y,ans[4],res[4];

void init()
{
    int i,j;
    a[0][0]=1,a[0][1]=x*x%mod,a[0][2]=y*y%mod,a[0][3]=2*x*y%mod;
    a[1][0]=0,a[1][1]=x*x%mod,a[1][2]=y*y%mod,a[1][3]=2*x*y%mod;
    a[2][0]=0,a[2][1]=1,a[2][2]=0,a[2][3]=0;
    a[3][0]=0,a[3][1]=x,a[3][2]=0,a[3][3]=y;

    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            p[i][j]=a[i][j];
}

void cal1()
{
    int i,j,k;
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
        {
            tmp[i][j]=a[i][j];
            a[i][j]=0;
        }

    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            for(k=0;k<4;k++)
                a[i][j]=(a[i][j]+tmp[i][k]*p[k][j])%mod;
}

void cal2()
{
    int i,j,k;
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
        {
            tmp[i][j]=p[i][j];
            p[i][j]=0;
        }

    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            for(k=0;k<4;k++)
                p[i][j]=(p[i][j]+tmp[i][k]*tmp[k][j])%mod;
}

int main()
{
    int i,j;
    while(cin>>n>>x>>y)
    {
        x%=mod,y%=mod;
        ans[0]=2;
        ans[1]=ans[2]=ans[3]=1;

        init();
        n-=2;
        while(n)
        {
            if(n&1)
                cal1();
            cal2();
            n>>=1;
        }

        memset(res,0,sizeof(res));
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                res[i]=(res[i]+a[i][j]*ans[j])%mod;
            }
        }

        printf("%d\n",res[0]);
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved