[poj 3070] [luogu 1962] Fibonacci {矩阵乘法+快速幂加速递推}

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82024689

题目

http://poj.org/problem?id=3070
https://www.luogu.org/problemnew/show/P1962


解题思路

矩阵乘法:

A n m 矩阵, B m p 矩阵,则 C = A B n p 矩阵,并且 i [ 1 , n ] , j [ 1 , p ]

C i , j = k = 1 m A i , k B k , j

因为矩阵乘法满足结合律,所以我们可以用快速幂计算【否则,矩阵乘法是一个很没有的东西~~至少我这么认为!!!】。


代码(poj_code

注意:与luogu的不一样
#include<cstdio>
#include<cstring>
#define WYC 10000
#define w 2
#define rep(i,x,y) for(register int i=x;i<y;i++)
using namespace std; 
int n,f[w],a[w][w]; 
void mull()
{
    int c[w][w]={{0,0},{0,0}}; 
    rep(i,0,w) rep(j,0,w) rep(k,0,w)
     c[i][j]=(c[i][j]+(long long)a[i][k]*a[k][j])%WYC; 
    memcpy(a,c,sizeof(c)); 
}
void mul()
{
    int c[w]={0,0};  
    rep(j,0,w) rep(k,0,w)
     c[j]=(c[j]+(long long)f[k]*a[k][j])%WYC; 
    memcpy(f,c,sizeof(c));
}
int main()
{
    while (scanf("%d",&n)&&n!=-1)
    {
        f[0]=0; f[1]=1; 
        a[0][0]=0; a[0][1]=1; a[1][0]=1; a[1][1]=1; 
        for(;n;mull(),n>>=1) if (n&1) mul(); 
        printf("%d\n",f[0]); 
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/82024689