1 条题解

  • 0
    @ 2024-12-29 19:25:44

    爆搜可得答案序列:

    1,1,2,4,6,9,14,21,31,46,68,100,147,1,1,2,4,6,9,14,21,31,46,68,100,147,\ldots

    瞪眼可得公式:

    $$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;
    }
    
    • 1

    信息

    ID
    77
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    3
    已通过
    3
    上传者