概述屏幕初始为一个 A,每按一次按钮所有 A 变成 B、所有 B 变成 BA,求按 k 次后 A、B 各有多少个。只需计数,不必真的拼出字符串:设按 i 次后各有若干 A 与 B,由变换写出递推,新的 A 数等于旧的 B 数,新的 B 数等于旧 A 数加旧 B 数,从初始的一个 A、零个 B 递推 k 步,数列恰为斐波那契。时间复杂度 O(k)。
屏幕初始为 A。每按一次按钮,每个 A 变成 B,每个 B 变成 BA。求按 k 次后 A、B 各有多少个。
只需计数,不必真的拼出字符串。设按 i 次后有 ai 个 A、bi 个 B。A→B 产生 1 个 B,B→BA 产生 1 个 A 与 1 个 B,于是:
{ai=bi−1bi=ai−1+bi−1
从 (a0,b0)=(1,0) 递推 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;
}