#include <iostream>
static constexpr auto MOD = 1000000007LL;
inline /*hint hint*/ long long mod(long long x)
{
if (x >= 0 && x < MOD) return x;
x %= MOD;
if (x < 0)
return x + MOD;
return x;
}
struct matrix
{
long long m[4][4];
static matrix multiply(const matrix &a, const matrix &b)
{
matrix c;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
c.m[i][j] = 0;
for (int k = 0; k < 4; k++)
c.m[i][j] += a.m[i][k] * b.m[k][j];
}
return c;
}
void normalize()
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
m[i][j] = mod(m[i][j]);
}
};
static matrix operator*(matrix const& a, matrix const& b)
{
return matrix::multiply(a,b);
}
template <typename T>
T pow(T const&a, long long n)
{
if (n == 0) throw "not implemented";
if (n == 1) return a;
auto b = pow(a*a, n>>1);
return (n & 1)? b*a : b;
}
int main()
{
//std::cout << "pow(2, 0): " << pow(2, 0) << std::endl;
std::cout << "pow(2, 1): " << pow(2ll, 1) << std::endl;
std::cout << "pow(2, 2): " << pow(2ll, 2) << std::endl;
std::cout << "pow(2, 3): " << pow(2ll, 3) << std::endl;
std::cout << "pow(2, 4): " << pow(2ll, 4) << std::endl;
std::cout << "pow(2, 5): " << pow(2ll, 5) << std::endl;
std::cout << "pow(2, 10): " << pow(2ll, 10) << std::endl;
std::cout << "pow(2, 16): " << pow(2ll, 16) << std::endl;
std::cout << "pow(2, 32): " << pow(2ll, 32) << std::endl;
matrix v = { { { 1,2,3,4}, { 2,3,4,5},
{ 3,4,5,6}, { 7,8,9,0} } };
for (long i = 0; i< (1ul << 22ul); ++i)
{
auto e = pow(v, 16);
e.normalize();
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RhdGljIGNvbnN0ZXhwciBhdXRvIE1PRCA9IDEwMDAwMDAwMDdMTDsKCmlubGluZSAvKmhpbnQgaGludCovIGxvbmcgbG9uZyBtb2QobG9uZyBsb25nIHgpCnsKICAgIGlmICh4ID49IDAgJiYgeCA8IE1PRCkgcmV0dXJuIHg7CgogICAgeCAlPSBNT0Q7CiAgICBpZiAoeCA8IDApCiAgICAgICAgcmV0dXJuIHggKyBNT0Q7CgogICAgcmV0dXJuIHg7Cn0KCnN0cnVjdCBtYXRyaXgKewoJbG9uZyBsb25nIG1bNF1bNF07CgoJc3RhdGljIG1hdHJpeCBtdWx0aXBseShjb25zdCBtYXRyaXggJmEsIGNvbnN0IG1hdHJpeCAmYikKCXsKCQltYXRyaXggYzsKCgkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCgkJCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKQoJCQl7CgkJCQljLm1baV1bal0gPSAwOwoJCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCgkJCQkJYy5tW2ldW2pdICs9IGEubVtpXVtrXSAqIGIubVtrXVtqXTsKCQkJfQoKCQlyZXR1cm4gYzsKCX0KCgl2b2lkIG5vcm1hbGl6ZSgpCgl7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCgkJCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKQoJCQkJbVtpXVtqXSA9IG1vZChtW2ldW2pdKTsKCX0KfTsKCnN0YXRpYyBtYXRyaXggb3BlcmF0b3IqKG1hdHJpeCBjb25zdCYgYSwgbWF0cml4IGNvbnN0JiBiKQp7CglyZXR1cm4gbWF0cml4OjptdWx0aXBseShhLGIpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KVCBwb3coVCBjb25zdCZhLCBsb25nIGxvbmcgbikKewogICAgaWYgKG4gPT0gMCkgdGhyb3cgIm5vdCBpbXBsZW1lbnRlZCI7CiAgICBpZiAobiA9PSAxKSByZXR1cm4gYTsKCiAgICBhdXRvIGIgPSBwb3coYSphLCBuPj4xKTsKCglyZXR1cm4gKG4gJiAxKT8gYiphIDogYjsKfQoKaW50IG1haW4oKQp7CgkvL3N0ZDo6Y291dCA8PCAicG93KDIsICAwKTogIiA8PCBwb3coMiwgIDApIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAicG93KDIsICAxKTogIiA8PCBwb3coMmxsLCAgMSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJwb3coMiwgIDIpOiAiIDw8IHBvdygybGwsICAyKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgInBvdygyLCAgMyk6ICIgPDwgcG93KDJsbCwgIDMpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAicG93KDIsICA0KTogIiA8PCBwb3coMmxsLCAgNCkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJwb3coMiwgIDUpOiAiIDw8IHBvdygybGwsICA1KSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgInBvdygyLCAxMCk6ICIgPDwgcG93KDJsbCwgMTApIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAicG93KDIsIDE2KTogIiA8PCBwb3coMmxsLCAxNikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJwb3coMiwgMzIpOiAiIDw8IHBvdygybGwsIDMyKSA8PCBzdGQ6OmVuZGw7CgoJbWF0cml4IHYgPSB7IHsgeyAxLDIsMyw0fSwgeyAyLDMsNCw1fSwKCQkgICAgICAgICAgIHsgMyw0LDUsNn0sIHsgNyw4LDksMH0gfSB9OwoKCWZvciAobG9uZyBpID0gMDsgaTwgKDF1bCA8PCAyMnVsKTsgKytpKQoJewoJCWF1dG8gZSA9IHBvdyh2LCAxNik7CgkJZS5ub3JtYWxpemUoKTsKCX0KfQo=