Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
- //
- #include <iostream>
- #include <vector>
- #include <string>
- using base = unsigned long long;
- const base b12 = 1'000'000'000'000;
- const base b8 = 1'000'000'00;
- class ell
- {
- base hi = 0, lo = 0;
- public:
- ell() {}
- ell(base n) { lo = n % b12; hi = n / b12; }
- ell operator+(const ell& arg2)const
- {
- ell res;
- res.lo = lo + arg2.lo;
- res.hi = hi + arg2.hi + res.lo / b12;
- res.lo %= b12;
- return res;
- };
- std::string tostring() const {
- std::string res = std::to_string(lo);
- if (hi > 0)
- {
- res = std::to_string(hi) + std::string(12 - res.length(), '0') + res;
- }
- return res;
- }
- friend std::ostream& operator<<(std::ostream& os, const ell& N)
- {
- return os << N.tostring();
- }
- };
- class ell24
- {
- base hi = 0, lo = 0, mi = 0;
- public:
- ell24() {}
- ell24(base n) { lo = n % b8; n /= b8; mi = n % b8; hi = n / b8; }
- ell24 operator+(const ell24& arg2)const
- {
- ell24 res;
- res.lo = lo + arg2.lo;
- res.mi = mi + arg2.mi + res.lo / b8;
- res.lo %= b8;
- res.hi = hi + arg2.hi + res.mi / b8;
- res.mi %= b8;
- return res;
- };
- ell24 operator*(const ell24& arg2)const
- {
- ell24 res;
- res.lo = lo * arg2.lo;
- res.mi = lo * arg2.mi + mi * arg2.lo + res.lo / b8;
- res.lo %= b8;
- res.hi = lo * arg2.hi + mi * arg2.mi + hi * arg2.lo + res.mi / b8;
- res.mi %= b8;
- return res;
- }
- std::string tostring() const {
- std::string lo_str = std::to_string(lo); lo_str = std::string(8 - lo_str.length(), '0') + lo_str;
- std::string mi_str = std::to_string(mi); mi_str = std::string(8 - mi_str.length(), '0') + mi_str;
- std::string res = std::to_string(hi) + mi_str + lo_str;
- return std::string(res.begin() + res.find_first_not_of('0'), res.end());
- }
- friend std::ostream& operator<<(std::ostream& os, const ell24& N)
- {
- return os << N.tostring();
- }
- };
- std::vector<ell> F(101);
- base fib(int n)
- {
- if (n <= 1)return n;
- return fib(n - 1) + fib(n - 2);
- }
- void fib_iter()
- {
- F[0] = 0;
- F[1] = 1;
- for (size_t i = 2; i < 101; i++)
- {
- F[i] = F[i - 1] + F[i - 2];
- }
- }
- //return Fib[n], Fib[n-1], n>0
- std::pair<ell24, ell24> Fib_pair(int n)
- {
- if (n == 1)
- return { 1,0 };
- if (n % 2 == 1)
- {
- auto prev = Fib_pair(n - 1);
- return { prev.first + prev.second, prev.first };
- }
- auto prev = Fib_pair(n / 2);
- auto fibsqr = prev.first * prev.first;
- auto fibprod = prev.first * prev.second;
- return { fibsqr + fibprod + fibprod, fibsqr + prev.second * prev.second };
- }
- class matrix2x2
- {
- public:
- ell24 a11, a12, a21, a22;
- matrix2x2 operator*(const matrix2x2& m)const
- {
- matrix2x2 r;
- r.a11 = a11 * m.a11 + a12 * m.a21;
- r.a12 = a11 * m.a12 + a12 * m.a22;
- r.a21 = a21 * m.a11 + a22 * m.a21;
- r.a22 = a21 * m.a12 + a22 * m.a22;
- return r;
- }
- matrix2x2 operator^(int n)const
- {
- matrix2x2 r = { 1,0,0,1 }, p = *this;
- while (n > 0)
- {
- if (n & 1)
- r = r * p;
- n /= 2;
- if (n)
- p = p * p;
- }
- return r;
- }
- };
- int main()
- {
- ell24 x(1234567890123), y(98765432101);
- std::cout << x * y << std::endl;
- fib_iter();
- for (size_t i = 10; i <= 100; i += 1)
- {
- std::cout << i << ":\t " << F[i] << std::endl;
- }
- auto fibpair100 = Fib_pair(100);
- std::cout << 100 << ":\t " << fibpair100.first << std::endl;
- matrix2x2 F{ 1,1,1,0 };
- F = F ^ 99;
- std::cout << F.a11 << std::endl;
- std::cout << "Hello World!\n";
- }
- // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
- // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
- // Советы по началу работы
- // 1. В окне обозревателя решений можно добавлять файлы и управлять ими.
- // 2. В окне Team Explorer можно подключиться к системе управления версиями.
- // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
- // 4. В окне "Список ошибок" можно просматривать ошибки.
- // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
- // 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement