HDU 5015 233 Matrix 矩陣快速冪

2022-05-22 08:42:14 字數 1645 閱讀 6650

題意:

給出乙個矩陣\(m\)的第\(0\)行和第\(0\)列,以及遞推關係\(m_=m_+m_\)。

求\(m_ \, mod \, 10000007\),其中\(n \leq 10, m < 2^\)

分析:注意到\(n\)比較小,而\(m\)比較大,我們可以構造矩陣,從第\(k\)列元素遞推到第\(k+1\)列元素。

具體構造方法如下:

以\(n=4\)為例:

\(\begin

10 & 0 & 0 & 0 & 0 & 1\\

10 & 1 & 0 & 0 & 0 & 1\\

10 & 1 & 1 & 0 & 0 & 1\\

10 & 1 & 1 & 1 & 0 & 1\\

10 & 1 & 1 & 1 & 1 & 1\\

0 & 0 & 0 & 0 & 0 & 1

\end

\begin

m_\\

m_\\

m_\\

m_\\

m_\\

3\end

=\begin

m_\\

m_\\

m_\\

m_\\

m_\\

3\end\)

所以我們計算這個矩陣的快速冪就可得到答案。

#include #include #include using namespace std;

typedef long long ll;

const int maxn = 15;

const ll mod = 10000007;

ll mul_mod(ll a, ll b)

ll add_mod(ll& a, ll b)

int n, m, sz;

int a[maxn], b[maxn];

struct matrix

matrix operator * (const matrix& t) const

};matrix pow_mod(matrix a, int n)

return ans;

}int main()

if(m == 0)

sz = n + 2;

b[0] = 233;

for(int i = 1; i <= n; i++) b[i] = (b[i-1] + a[i]) % mod;

b[n + 1] = 3;

matrix m;

for(int i = 0; i < sz - 1; i++) m.a[i][0] = 10;

for(int i = 0; i < sz; i++) m.a[i][sz-1] = 1;

for(int i = 1; i < sz - 1; i++)

for(int j = 1; j <= i; j++) m.a[i][j] = 1;

m = pow_mod(m, m - 1);

ll ans = 0;

for(int i = 0; i < sz; i++)

add_mod(ans, mul_mod(m.a[sz-2][i], b[i]));

printf("%lld\n", ans);

} return 0;

}

HDU 5015 233 Matrix 矩陣遞推

題意 給出乙個矩陣,第一行從左到右分別是233,2333,23333,2333333。給出第一列的元素。其他的元素是它上面和左面的元素的和。求右下角元素的值。思路 在比賽的時候,總是想從右下角的元素遞推回去,找到公式,直接計算。發現沒法高效的求和。這道題正確的解法是利用矩陣從第二列開始遞推,每次得到...

HDU5015 233 Matrix 矩陣快速冪

題目鏈結 題意 給定乙個矩陣的第0列的第1到n個數,第一行第1個數開始每個數分別為233,2333.求第n行的第m個數。思路 將第一行的數全部右移一位,用前一列遞推出下一列,構造矩陣,類似如下 1 0 0 0 0 0 0 1 10 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 ...

hdu5015 233 Matrix(矩陣快速冪)

解題思路 根據題目我們發現n的值最大只有10,而m的值最大為10 9,因此可以考慮使用矩陣冪運算,以列為單位 我們根據推理可以發現由前一列乘以某個矩陣之後可以得到後一列,矩陣如下 10 0 0 0 0 1 10 1 0 0 0 1 10 1 1 0 0 1 10 1 1 1 1 1 0 0 0 0 ...