http://acm.hdu.edu.cn/showproblem.php?pid=2842
//递推公式 f[n] = f[n-1] + 2*f[n-2] +1 f[1] = 1 f[2] =2
#include<iostream>//2255440 2010-03-27 17:26:15 Accepted 2842 0MS 296K 1332 B C++ 悔惜晟
using namespace std;
const int mod = 200907;
struct stu
{
long long int a[3][3];
} df1, df2;
stu mul(stu p, stu q)
{
int i, j, k;
stu r;
for(i = 0; i < 3; i++)
for(j = 0; j < 3 ; j++)//一开始这里括号加错了,郁闷了好久
{
r.a[i][j] = 0;
for( k = 0; k < 3; k++)
r.a[i][j] += p.a[i][k]* q.a[k][j];
if(r.a[i][j] >= mod)
r.a[i][j] %= mod;
}
return r;
}
stu mal(int n)
{
stu p = df1;
stu q = df2;
while(n > 1)
{
if(n % 2 == 0)
{
q = mul(q, q);
n /= 2;
}
else
{
p = mul(p , q);
n--;
}
}
return mul(p, q);
}
int main()
{
int n, s[4], i, j;
long long sum;
while(cin>>n && n != 0)//0的时候不执行
{
if(n == 1)
cout<<"1"<<endl;
else if(n == 2)
cout<<"2"<<endl;
else
{
n -= 2;
for(i = 0 ;i < 3; i++)
for(j =0 ; j <3 ;j++)
if(i == j)
df1.a[i][j] = 1;
else
df1.a[i][j] =0;
df2.a[0][0] = 1;
df2.a[0][1] = 2;
df2.a[0][2] = 1;
df2.a[1][0] = 1;
df2.a[1][1] = 0;
df2.a[1][2] = 0;
df2.a[2][0] = 0;
df2.a[2][1] = 0;//一开始矩阵写错了。纠结啊。。
df2.a[2][2] = 1;//
s[0] = 2;
s[1] = 1;
s[2] = 1;
stu ans;
ans = mal(n);
sum = 0;
for(i = 0 ; i < 3; i++)
sum += (ans.a[0][i]*s[i])%mod;
cout<<sum%mod<<endl;
}
}
}