#include <iostream>
#include <ctime>
using namespace std;
constexpr pair<double, double> helper(size_t n, const pair<double, double>& g)
{
return n % 2
? make_pair(g.second * g.second + g.first * g.first, g.second * g.second + 2 * g.first * g.second)
: make_pair(2 * g.first * g.second - g.first * g.first, g.second * g.second + g.first * g.first);
}
constexpr pair<double, double> fibonacciRecursive(size_t n)
{
return n < 2
? make_pair<double, double>(n, 1)
: helper(n, fibonacciRecursive(n / 2));
}
constexpr double fibonacci(size_t n)
{
return fibonacciRecursive(n).first;
}
int main() {
cout << "start\t " << time(NULL) << endl;
cout << fibonacci(0) << endl;
cout << fibonacci(1) << endl;
cout << fibonacci(2) << endl;
cout << fibonacci(3) << endl;
cout << fibonacci(4) << endl;
cout << fibonacci(5) << endl;
cout << fibonacci(100) << endl;
cout << "finish\t " << time(NULL) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3RpbWU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgogICAgY29uc3RleHByIHBhaXI8ZG91YmxlLCBkb3VibGU+IGhlbHBlcihzaXplX3QgbiwgY29uc3QgcGFpcjxkb3VibGUsIGRvdWJsZT4mIGcpCiAgICB7CiAgICAgICAgcmV0dXJuIG4gJSAyCiAgICAgICAgICAgID8gbWFrZV9wYWlyKGcuc2Vjb25kICogZy5zZWNvbmQgKyBnLmZpcnN0ICogZy5maXJzdCwgZy5zZWNvbmQgKiBnLnNlY29uZCArIDIgKiBnLmZpcnN0ICogZy5zZWNvbmQpCiAgICAgICAgICAgIDogbWFrZV9wYWlyKDIgKiBnLmZpcnN0ICogZy5zZWNvbmQgLSBnLmZpcnN0ICogZy5maXJzdCwgZy5zZWNvbmQgKiBnLnNlY29uZCArIGcuZmlyc3QgKiBnLmZpcnN0KTsKICAgIH0KICAgIAogICAgY29uc3RleHByIHBhaXI8ZG91YmxlLCBkb3VibGU+IGZpYm9uYWNjaVJlY3Vyc2l2ZShzaXplX3QgbikKICAgIHsKICAgICAgICByZXR1cm4gbiA8IDIKICAgICAgICAgICAgPyBtYWtlX3BhaXI8ZG91YmxlLCBkb3VibGU+KG4sIDEpCiAgICAgICAgICAgIDogaGVscGVyKG4sIGZpYm9uYWNjaVJlY3Vyc2l2ZShuIC8gMikpOwogICAgfQogICAgCiAgICBjb25zdGV4cHIgZG91YmxlIGZpYm9uYWNjaShzaXplX3QgbikKICAgIHsKICAgICAgICByZXR1cm4gZmlib25hY2NpUmVjdXJzaXZlKG4pLmZpcnN0OwogICAgfQoKCmludCBtYWluKCkgewoJY291dCA8PCAic3RhcnRcdCAiIDw8ICB0aW1lKE5VTEwpIDw8IGVuZGw7Cgljb3V0IDw8IGZpYm9uYWNjaSgwKSA8PCBlbmRsOwoJY291dCA8PCBmaWJvbmFjY2koMSkgPDwgZW5kbDsKCWNvdXQgPDwgZmlib25hY2NpKDIpIDw8IGVuZGw7Cgljb3V0IDw8IGZpYm9uYWNjaSgzKSA8PCBlbmRsOwoJY291dCA8PCBmaWJvbmFjY2koNCkgPDwgZW5kbDsKCWNvdXQgPDwgZmlib25hY2NpKDUpIDw8IGVuZGw7Cgljb3V0IDw8IGZpYm9uYWNjaSgxMDApIDw8IGVuZGw7Cgljb3V0IDw8ICJmaW5pc2hcdCAiIDw8IHRpbWUoTlVMTCkgPDwgZW5kbDsKCXJldHVybiAwOwp9