- P45's solution
P45's Solution
- 2025-9-4 21:59:40 @
爆搜可得答案序列:
瞪眼可得公式:
$$A_n=\begin{cases}\lceil 2^{n-2}\rceil,&n\le 4\\2A_{n-1}-A_{n-2}+A_{n-3}-A_{n-4},&n \ge 5\end{cases} $$实际上这就是 OEIS A038718:
$$A_n=\begin{cases}\lceil 2^{n-2}\rceil,&n\le 4\\2A_{n-1}+A_{n-3}+1,&n \ge 5\end{cases} $$#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7;
struct Square
{
int n, m;
long long a[5][5];
};
Square operator*(Square a, Square b)
{
if (a.m != b.n) exit(-1);
int n = a.n, m = a.m, k = b.m;
Square c;
c.n = n, c.m = k;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= k; j++)
c.a[i][j] = 0;
for (int i = 1; i <= n; i++)
for(int j = 1; j <= k; j++)
for (int l = 1; l <= m; l++)
c.a[i][j] += a.a[i][l] * b.a[l][j], c.a[i][j] %= P;
return c;
}
Square operator^(Square a, long long b)
{
int n = a.n;
if (a.n != a.m) exit(-1);
Square tmp[64];
tmp[0] = a;
for (int i = 1; i <= 63; i++)
tmp[i] = tmp[i - 1] * tmp[i - 1];
Square c;
c.n = c.m = n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
c.a[i][j] = (i == j);
for (long long i = 0, j = 1; i <= 63; i++, j <<= 1)
if (b & j) c = c * tmp[i];
return c;
}
string s1 =
R"(
4 4
2 1000000006 1 1000000006
1 0 0 0
0 1 0 0
0 0 1 0
)";
string s2 =
R"(
4 1
4
2
1
1
)";
int main()
{
long long n;
cin >> n;
stringstream ss;
ss << s1 << s2;
Square p, q;
ss >> p.n >> p.m;
for (int i = 1; i <= p.n; i++)
for (int j = 1; j <= p.m; j++)
ss >> p.a[i][j];
ss >> q.n >> q.m;
for (int i = 1; i <= q.n; i++)
for (int j = 1; j <= q.m; j++)
ss >> q.a[i][j];
if (n <= 4)
{
cout << q.a[5 - n][1] << endl;
return 0;
}
q = (p ^ (n - 4)) * q;
cout << q.a[1][1] << endl;
return 0;
}