程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> CodeForces Round #118 (185A) - Plant

CodeForces Round #118 (185A) - Plant

編輯:C++入門知識

這次比賽的時間是23:30開始...囧...寫了一道A題就回去睡覺了..這場比賽有三道題A的人很多..本題就是一個很典型的找遞推式..用矩陣乘法求解...
     另  N [ k ] [ 0 ] 表示第 k 時間向上三角形個數... N [ k ] [ 1 ] 表示 k 時間向下三角形個數...那麼易得:
         N [ k ] [ 0 ] = N [ k-1 ] [ 0 ] * 3 + N [ k - 1 ] [ 1 ] 
         N [ k ] [ 1 ] = N [ k-1 ] [ 1 ] * 3 + N [ k - 1 ] [ 0 ] 
     由於k很大..只能用矩陣乘法求解..構造矩陣:
    h=   [     3        1
                  1        3     ]    
      初始值為  A={ 1 , 0 }
      那麼要求第k天的情況:   A*h^k  即可.... 

Program:
[cpp] 
#include<iostream> 
#include<algorithm> 
#include<stdio.h> 
#include<string.h> 
#include<math.h> 
#include<queue> 
#define oo 2000000000 
#define ll long long 
using namespace std;  
struct node 

       ll s[2][2]; 
}_2jie[70],temp; 
ll n; 
node matrix_mul(node a,node b) 

       int k,i,j; 
       memset(temp.s,0,sizeof(temp.s)); 
       for (k=0;k<2;k++) 
          for (i=0;i<2;i++) 
             for (j=0;j<2;j++) 
                temp.s[i][j]=(temp.s[i][j]+a.s[i][k]*b.s[k][j])%1000000007; 
       return temp; 

node getanswer(node h,ll l) 

       ll k,i; 
       node ans; 
       _2jie[1]=h; 
       k=2; 
       for (i=2;i<63;i++) 
       { 
              _2jie[i]=matrix_mul(_2jie[i-1],_2jie[i-1]); 
              k*=2; 
       } 
       ans.s[0][0]=1; ans.s[0][1]=0; 
       ans.s[1][0]=0; ans.s[1][1]=1; 
       while (l) 
       { 
             while (k>l) 
             { 
                   i--; 
                   k/=2; 
             } 
             ans=matrix_mul(ans,_2jie[i]); 
             l-=k; 
       } 
       return ans; 

int main() 
{       
       scanf("%I64d",&n); 
       node h; 
       h.s[0][0]=3; h.s[0][1]=1; 
       h.s[1][0]=1; h.s[1][1]=3; 
       h=getanswer(h,n); 
       printf("%I64d\n",h.s[0][0]);        
       return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved