OriginalMar 22, 2022 168 words 1 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 。每按一次按钮,每个 A \texttt A A 变成 B \texttt B B ,每个 B \texttt B B 变成 BA \texttt{BA} BA 。求按 k k k 次后 A \texttt A A 、B \texttt B B 各有多少个。
只需计数,不必真的拼出字符串。设按 i i i 次后有 a i a_i a i 个 A \texttt A A 、b i b_i b i 个 B \texttt B B 。A → B \texttt A\to\texttt B A → B 产生 1 1 1 个 B \texttt B B ,B → BA \texttt B\to\texttt{BA} B → BA 产生 1 1 1 个 A \texttt A A 与 1 1 1 个 B \texttt B B ,于是:
{ a i = b i − 1 b i = a i − 1 + b i − 1 \begin{cases}
a_i=b_{i-1} \\
b_i=a_{i-1}+b_{i-1}
\end{cases} { a i = b i − 1 b i = a i − 1 + b i − 1
从 ( a 0 , b 0 ) = ( 1 , 0 ) (a_0,b_0)=(1,0) ( a 0 , b 0 ) = ( 1 , 0 ) 递推 k k k 步即可,数列恰是斐波那契。
时间复杂度为 O ( k ) O(k) O ( k ) 。
# 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 ;
}