hdu 1005 Number Sequence(矩阵快速幂,找规律,模版更通用)

题目

 

第一次做是看了大牛的找规律结果,如下:

 

//显然我看了答案,循环节点是48,但是为什么是48,据说是高手打表出来的
#include<stdio.h>
int main()
{
    int f[50],a,b,i,n;
    f[1]=1;f[2]=1;
    while(scanf("%d%d%d",&a,&b,&n)!=EOF)
    {
        if(a==0&&b==0&&n==0)break;

        for(i=3;i<49;i++)
        {
            f[i]=(a*f[i-1])%7+(b*f[i-2])%7;
        }
        printf("%d\n",f[n%48]%7);
    }
    return 0;
}
View Code

 

 

第二次做是学了矩阵快速幂,这是经典的矩阵快速幂简单题

 

//简单的矩阵快速幂
//f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
//注意origin矩阵中的第二行的a和b的位置摆放
#include<stdio.h>
#include<string.h>
int num=2,mod=7;
struct matrix
{
    int a[2][2];
};
matrix multiply(matrix x,matrix y)//矩阵乘法
{
    matrix temp;
    memset(temp.a,0,sizeof(temp.a));
    for(int i=0;i<num;i++)
    {
        for(int k=0;k<num;k++)
        {
            for(int j=0;j<num;j++)
            {
                temp.a[i][j]=(temp.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
            }
        }
    }
    return temp;
}
matrix calc(matrix a,int n)//矩阵快速幂——a^n
{
    if(n==1)return a;
    matrix e;
    for(int i=0;i<num;i++)
        for(int j=0;j<num;j++)
            e.a[i][j]=(i==j);

    while(n)
    {
        if(n&1)
            e=multiply(e,a);
        n>>=1;
        a=multiply(a,a);
    }
    return e;
}
int main()
{
    int n,a,b;
    while(scanf("%d%d%d",&a,&b,&n)!=EOF)
    {
        if(a==0&&b==0&&n==0)break;
        matrix origin= {0,1};
        origin.a[1][0]=b;origin.a[1][1]=a;
        matrix answ={1,0,
                     1,0};        
        if(n>2)
            answ=multiply(calc(origin,n-2),answ);
        printf("%d\n",answ.a[1][0]);
    }
    return 0;
}
View Code

 

posted @ 2014-02-25 20:53  laiba2004  Views(191)  Comments(0Edit  收藏  举报