2016年10月16日 星期日

TIOJ 1494 肺噬數列 - 續

http://tioj.infor.org/problems/1168

超級數學的一題
雖然是模擬賽的題目 可是我還是上網查資料才解出來的((

總之可以觀察到gcd(Fa,Fb)==F(gcd(a,b))
然後丟上去就發現TLE了
於是才找到log n快速算費式數列的方法
然後因為肺噬數列跟費式數列剛好有差一項 所以記得要處理一下-w-



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int Z=1e9+7;

inline ll gcd(ll a,ll b){
    if(b>a)swap(a,b);
    while(b){
        a%=b;
        swap(a,b);
    }
    return a;
}

map<ll,ll> f;
ll F(ll n){
    if(f.count(n)) return f[n];
    ll k=n/2;
    if(n%2==0)
        return f[n]=(F(k)*F(k)%Z+F(k-1)*F(k-1)%Z) % Z;
    else
        return f[n]=(F(k)*F(k+1)%Z+F(k-1)*F(k)%Z) % Z;
}

int main(){
    f[1]=1;f[2]=2;

    ll a,b;
    cin>>a>>b;
    ll g=gcd(a+1,b+1)-1;
    f[0]=1;
    f[1]=1;
    f[2]=2;
    cout<<F(g)<<endl;

}

沒有留言:

張貼留言