Skip to main content
Original168 words1 min

题解:P8241 [COCI 2013/2014

Summary

屏幕初始为一个 A,每按一次按钮所有 A 变成 B、所有 B 变成 BA,求按 k 次后 A、B 各有多少个。只需计数,不必真的拼出字符串:设按 i 次后各有若干 A 与 B,由变换写出递推,新的 A 数等于旧的 B 数,新的 B 数等于旧 A 数加旧 B 数,从初始的一个 A、零个 B 递推 k 步,数列恰为斐波那契。时间复杂度 O(k)。

题意简述​

屏幕初始为 A\texttt A。每按一次按钮,每个 A\texttt A 变成 B\texttt B,每个 B\texttt B 变成 BA\texttt{BA}。求按 kk 次后 A\texttt A、B\texttt B 各有多少个。

解题思路​

只需计数,不必真的拼出字符串。设按 ii 次后有 aia_i 个 A\texttt A、bib_i 个 B\texttt B。A→B\texttt A\to\texttt B 产生 11 个 B\texttt B,B→BA\texttt B\to\texttt{BA} 产生 11 个 A\texttt A 与 11 个 B\texttt B,于是:

{ai=bi−1bi=ai−1+bi−1\begin{cases} a_i=b_{i-1} \\ b_i=a_{i-1}+b_{i-1} \end{cases}

从 (a0,b0)=(1,0)(a_0,b_0)=(1,0) 递推 kk 步即可,数列恰是斐波那契。

时间复杂度为 O(k)O(k)。

参考代码​

221 Bcpp
#include <bits/stdc++.h>
using namespace std;

int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int k;
cin>>k;
int a=1,b=0;
while(k--)
{
int t=a;
a=b;
b=t+b;
}
cout<<a<<' '<<b<<'\n';
return 0;
}