B.Coffee Chicken(递归)
•题意
定义 S1 = "COFFEE" , S2 = "CHICKEN";
Si = Si-2 + Si-1;
求在 Sn 中,以第 k 个字符开始的连续 10 个字符;
k ≤ min( |Sn| , 1012);
•Code
View Code1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 5 int n; 6 ll k; 7 ll f[80]; 8 string s[3]; 9 10 string F(ll l,ll r,int pos) 11 { 12 // printf("pos=%d,(%lld,%lld)\n",pos,l,r); 13 if(pos <= 2) 14 return s[pos].substr(l,r-l+1); 15 16 ll mid=f[pos-2]; 17 18 string ans; 19 if(r <= mid) 20 return F(l,r,pos-2); 21 else if(l > mid) 22 return F(l-mid,r-mid,pos-1); 23 else 24 { 25 // ans=F(l,mid,pos-2)+F(1,r-mid,pos-1); 26 ans=F(l,mid,pos-2); 27 ans += F(1,r-mid,pos-1); 28 } 29 return ans; 30 } 31 string Solve() 32 { 33 if(n > 60) 34 n=(n&1 ? 59:60); 35 36 cout<<F(k,min(k+9,f[n]),n)<<endl; 37 } 38 void Init() 39 { 40 s[1]="#COFFEE"; 41 s[2]="#CHICKEN"; 42 f[1]=6; 43 f[2]=7; 44 for(int i=3;i <= 60;++i) 45 f[i]=f[i-1]+f[i-2]; 46 } 47 int main() 48 { 49 Init(); 50 51 int T; 52 cin>>T; 53 while(T--) 54 { 55 cin>>n>>k; 56 Solve(); 57 } 58 }