hdu 2842 Chinese Rings

f[n]=2*f[n-2]+f[n-1]+1,f[1]=1,f[2]=2

#include <stdio.h>

#define CIRCLE 3186
#define MOD 200907

int main()
{
    int a[CIRCLE]={1,1,2};
    int i;
/*   
    find the circle
    for(i=3;i<10000;i++)
    {
        a[i] = (2*a[i-2] + a[i-1] + 1) % MOD;
        if(a[i]==2 && a[i-1]==1) printf("%d ",i-2);
    }
*/
    for(i=3;i<CIRCLE;i++)
    {
        a[i] = (2*a[i-2] + a[i-1] + 1) % MOD;
    }
    while(scanf("%d",&i),i)
    {
        printf("%d\n",a[i%CIRCLE]);
    }
    return 0;
}


//**********************************************************
二分矩阵:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXN 3
#define MOD 200907

typedef __int64 lli;

struct Matrix
{
    Matrix(int,int);
    Matrix(int,int,int [MAXN][MAXN]);
    friend Matrix operator*(const Matrix &,const Matrix &);
    int r,c;
    lli mat[MAXN][MAXN];
};
Matrix::Matrix(int rr,int cc)
{
    r=rr;
    c=cc;
    for(int i=0;i<r;i++)
    {
        for(int j=0;j<c;j++)
        {
            if(i==j) mat[i][j]=1;
            else mat[i][j]=0;
        }
    }
}
Matrix::Matrix(int rr,int cc,int ar[MAXN][MAXN])
{
    r=rr;
    c=cc;
    for(int i=0;i<r;i++)
    {
        for(int j=0;j<c;j++)
        {
            mat[i][j]=ar[i][j];
        }
    }
}

Matrix operator*(const Matrix &m1,const Matrix &m2)
{
    Matrix m3(m1.r,m2.c);
    for(int i=0;i<m1.r;i++)
    {
        for(int j=0;j<m2.c;j++)
        {
            m3.mat[i][j]=0;
            for(int k=0;k<m1.c;k++)
            {
                m3.mat[i][j] = ( m3.mat[i][j] + m1.mat[i][k] * m2.mat[k][j] ) % MOD;
            }
        }
    }
    return m3;
}

Matrix solve(Matrix a,lli n)
{
    Matrix s(a.r,a.c);
    while(n>0)
    {
        if(n&1) s=s*a;
        a=a*a;
        n>>=1;
    }
    return s;
}

int main()
{
    int cell[MAXN][MAXN]={{1,1,0},{2,0,0},{1,0,1}};
    lli n,ans;
    Matrix mata(MAXN,MAXN,cell),mats(3,3);
    while(scanf("%I64d",&n),n)
    {
        if(n==1 || n==2)
        {
            printf("%d\n",n);
            continue;
        }
        mats=solve(mata,n-2);
        ans = ( 2 * mats.mat[0][0] + mats.mat[1][0] + mats.mat[2][0] ) % MOD;
        printf("%I64d\n",ans);
    }
    return 0;
}

posted @ 2010-08-31 19:04  菜到不得鸟  阅读(207)  评论(0)    收藏  举报