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;
}
浙公网安备 33010602011771号