您的位置:首页 > 产品设计 > UI/UE

hdu 1005Number Sequence (矩阵快速幂)

2013-06-01 10:53 393 查看
F(n) a b F(n-1)

= *

F(n-1 ) 1 0 F(n-2)

矩阵快速幂 (跟着大师学矩阵快速幂 )

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct Matrix
{
    int m[2][2];
}E,A;
void init()
{
    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
    E.m[i][j]=(i==j);
}
Matrix Mut(Matrix A,Matrix B,int mod)
{
    Matrix ans;
    int i,j,k;
    for(i=0;i<2;i++)
    for(j=0;j<2;j++)
    {
        ans.m[i][j]=0;
        for(k=0;k<2;k++)
        ans.m[i][j]=(ans.m[i][j]+(A.m[i][k]%mod)*(B.m[k][j]%mod))%mod;
    }
    return ans;
}
Matrix quick(Matrix A,int n,int mod)
{
    Matrix t=A,d=E;
    while(n)
    {
        if(n%2) d=Mut(d,t,mod);
        n/=2;
        t=Mut(t,t,mod);
    }
    return d;
}
int main()
{
    init();
    int a,b,n;
    while(scanf("%d%d%d",&a,&b,&n)!=EOF)
    {
        if(a==0&&b==0&&n==0)
        break;
        if(n==1||n==2)
        {
            printf("1\n");
        }
        else
        {
            A.m[0][0]=a;
            A.m[0][1]=b;
            A.m[1][0]=1;
            A.m[1][1]=0;
            Matrix ans=quick(A,n-2,7);
            printf("%d\n",(ans.m[0][0]+ans.m[0][1])%7);
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: