題意:
給出乙個矩陣\(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 ...