2016年8月27日 星期六

ZJ b525 先別管這個了,你聽過turtlebee嗎?

ZJ b525  先別管這個了,你聽過turtlebee嗎?

題目概述:
turtlebee是一種神秘的生物。傳聞中turtlebee可以根據服裝改變自己的性別,如果穿男裝就會是雄性,穿女裝就會是雌性。傳說turtlebee有很強的生育能力,一隻女裝turtlebee過一天後就會生出一隻新的男裝turtlebee。而男裝turtlebee過一天後就會換上女裝,而且不會再換回來。你知道現在有幾隻男裝turtlebee及幾隻女裝turtlebee,問你k天后會有幾隻turtlebee。

思路:
枚舉出來會發現好像很類似費式數列之類的東西。
數字非常大,不能用O(n)解。
可以利用矩陣快速冪!!
ZJ b525題解圖.jpg


AC code:
//By SCJ
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define MOD 100000007
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
mat mul(mat &A,mat &B)
{
   mat C((int)A.size(),vec((int)B[0].size()));
   for(int i=0;i<A.size();++i)
       for(int j=0;j<B[0].size();++j)
           for(int k=0;k<B.size();++k)
               C[i][j]=(C[i][j]+A[i][k]*B[k][j]%MOD)%MOD;
   return C;
}
mat POW(mat A,ll n)
{
   mat res(A.size(),vec(A.size()));
   for(int i=0;i<A.size();++i) res[i][i]=1;
   mat base=A;
   while(n)
   {
       if(n&1) res=mul(base,res);
       base=mul(base,base);
       n>>=1;
   }
   return res;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
   ll a,b,c;
   mat P(2,vec(2));
   P[0][0]=0;
   P[0][1]=P[1][0]=P[1][1]=1;
   while(cin>>a>>b>>c)
   {
       mat A(2,vec(1));
       A[0][0]=a;
       A[1][0]=b;
       mat tp=POW(P,c);
       mat ans=mul( tp , A );
       cout<<(ans[0][0]+ans[1][0])%MOD<<endl;
   }
}

沒有留言:

張貼留言