#include <iostream>
#include <cmath>
using namespace std;
unsigned long fib(unsigned n) {
switch (n) {
case 0: return 0;
case 1: return 1;
case 2: return 1;
case 3: return 2;
}
double const phi = (1 + sqrt(5)) / 2.0;
double const chi = 1 - phi;
return round((pow(phi, n) - pow(chi, n)) / (phi - chi));
}
long long sequence (long long A, long long B, unsigned n) {
if(n ==0) {
return A;
}
auto part_a = fib(n-1) * A;
auto part_b = fib (n) * B;
return (n % 2 == 0) ? (part_a - part_b) : (part_b - part_a);
}
int main() {
unsigned A = 42;
unsigned B = 21;
long long prev[2] = {A, B};
for(auto it = 2; it < 100; ++it) {
auto control = prev[0] - prev[1];
prev[0] = prev[1];
prev[1] = control;
auto test = sequence (A,B, it);
if (test != control) {
cout << it << ": " << fib (it) << " "
<< test << " " << control << endl;
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKCnVuc2lnbmVkIGxvbmcgZmliKHVuc2lnbmVkIG4pIHsKIHN3aXRjaCAobikgewogIGNhc2UgMDogcmV0dXJuIDA7CiAgY2FzZSAxOiByZXR1cm4gMTsKICBjYXNlIDI6IHJldHVybiAxOwogIGNhc2UgMzogcmV0dXJuIDI7CiB9CiBkb3VibGUgY29uc3QgcGhpID0gKDEgKyBzcXJ0KDUpKSAvIDIuMDsKIGRvdWJsZSBjb25zdCBjaGkgPSAxIC0gcGhpOwogcmV0dXJuIHJvdW5kKChwb3cocGhpLCBuKSAtIHBvdyhjaGksIG4pKSAvIChwaGkgLSBjaGkpKTsKfQpsb25nIGxvbmcgc2VxdWVuY2UgKGxvbmcgbG9uZyBBLCBsb25nIGxvbmcgQiwgdW5zaWduZWQgbikgewogaWYobiA9PTApIHsKICByZXR1cm4gQTsKIH0KIGF1dG8gcGFydF9hID0gZmliKG4tMSkgKiBBOwogYXV0byBwYXJ0X2IgPSBmaWIgKG4pICogQjsKIHJldHVybiAobiAlIDIgPT0gMCkgPyAocGFydF9hIC0gcGFydF9iKSA6IChwYXJ0X2IgLSBwYXJ0X2EpOwp9CgppbnQgbWFpbigpIHsKIHVuc2lnbmVkIEEgPSA0MjsKIHVuc2lnbmVkIEIgPSAyMTsKIGxvbmcgbG9uZyBwcmV2WzJdID0ge0EsIEJ9OwogZm9yKGF1dG8gaXQgPSAyOyBpdCA8IDEwMDsgKytpdCkgewogIGF1dG8gY29udHJvbCA9IHByZXZbMF0gLSBwcmV2WzFdOwogIHByZXZbMF0gPSBwcmV2WzFdOwogIHByZXZbMV0gPSBjb250cm9sOwogIGF1dG8gdGVzdCA9IHNlcXVlbmNlIChBLEIsIGl0KTsKICBpZiAodGVzdCAhPSBjb250cm9sKSB7CiAgICBjb3V0IDw8IGl0IDw8ICI6ICIgPDwgZmliIChpdCkgPDwgIiAiCiAgICAgICA8PCB0ZXN0IDw8ICIgIiA8PCBjb250cm9sIDw8IGVuZGw7CiAgfQogfQogcmV0dXJuIDA7Cn0=