超級數學的一題
雖然是模擬賽的題目 可是我還是上網查資料才解出來的((
總之可以觀察到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; } |
沒有留言:
張貼留言