Chinese Rings 2842 hdu (http://qzc.zgz.cn/Y-jiulianhuan3.htm 很流氓的网址)

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;
  }
 }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值