题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575
很水的模板题:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 101
#define MOD 9973
struct Mat
{
int a[maxn][maxn];
Mat() {memset(a, 0, sizeof(a));}
Mat(int i)
{
memset(a, 0, sizeof(a));
for (int i=0; i<maxn; ++i)
a[i][i] = 1;
}
}E(1);
Mat operator*(Mat a, Mat b)
{
Mat c;
for (int i=0; i<maxn; ++i)
for (int j=0; j<maxn; ++j)
{
c.a[i][j] = 0;
for (int k=0; k<maxn; ++k)
{
c.a[i][j] += a.a[i][k]*b.a[k][j];
if (c.a[i][j]>=MOD)
c.a[i][j] %= MOD;
}
}
return c;
}
Mat operator^(Mat a, int n)
{
Mat ans = E, q = a;
for (; n; n>>=1)
{
if (n&1)
ans = ans*q;
q = q*q;
}
return ans;
}
int main()
{
int ncase, n, k, ans;
Mat a;
cin >> ncase;
while (ncase--)
{
cin >> n >> k;
for (int i=0; i<n; ++i)
for (int j=0; j<n; ++j)
cin >> a.a[i][j];
a = a^k;
ans = 0;
for (int i=0; i<n; ++i)
ans += a.a[i][i];
ans%=MOD;
cout << ans << endl;
}
return 0;
}
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1757
构造一个
|f(10) | |a0 a1 a2 ...a8 a9| |f(9)|
| f(9) | | 1 0 0 .. . 0 0 | |f(8)|
| ..... | = | .. ......................... | | .. |
| f(2) | | 0 0 0 ... 0 0| |f(1)|
| f(1) | | 0 0 0 ... 1 0| |f(0)|
#include <iostream> #include <cstdio> using namespace std; #define N 10 int MOD = 9973; struct Mat { int mat[N][N]; Mat() { memset(mat, 0, sizeof(mat)); } }E; void get_E(Mat &a) { for (int i=0; i<N; ++i) a.mat[i][i] = 1; } Mat operator*(Mat a, Mat b) { Mat c; for (int i=0; i<N; ++i) for (int j=0; j<N; ++j) { c.mat[i][j] = 0; for (int k=0; k<N; ++k) c.mat[i][j] += (a.mat[i][k]*b.mat[k][j])%MOD; c.mat[i][j] %= MOD; } return c; } Mat operator^(Mat a, int n) { Mat ans = E, p = a; for ( ; n; n>>=1) { if (n&1) ans = ans*p; p = p*p; } return ans; } int main() { get_E(E); int k, m, a[N]; while (cin >> k >> m) { for (int i=0; i<N; ++i) cin >> a[i]; MOD = m; if (k<10) { cout << k%m << endl; continue; } Mat p; for (int i=0; i<N; ++i) p.mat[0][i] = a[i]; for (int i=1; i<N; ++i) p.mat[i][i-1] = 1; k = k-9; p = p^k; int ans = 0; for (int i=0; i<N; i++) ans += (p.mat[0][i]*(N-1-i))%MOD; cout << ans%MOD << endl; } return 0; }
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1683
构造
3 2 7 0 f(n-1) f(n)
1 0 0 0 * f(n-2) = f(n-1)
0 1 0 0 f(n-3) f(n-2)
3 2 7 1 sum sum'
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 4
#define MOD 2009
struct Mat
{
int a[maxn][maxn];
Mat() {memset(a, 0, sizeof(a));}
Mat(int i)
{
memset(a, 0, sizeof(a));
for (int i=0; i<maxn; ++i)
a[i][i] = 1;
}
}E(1);
Mat operator*(Mat a, Mat b)
{
Mat c;
for (int i=0; i<maxn; ++i)
for (int j=0; j<maxn; ++j)
{
c.a[i][j] = 0;
for (int k=0; k<maxn; ++k)
{
c.a[i][j] += a.a[i][k]*b.a[k][j];
if (c.a[i][j]>=MOD)
c.a[i][j] %= MOD;
}
}
return c;
}
Mat operator^(Mat a, int n)
{
Mat ans = E, q = a;
for (; n; n>>=1)
{
if (n&1)
ans = ans*q;
q = q*q;
}
return ans;
}
int main()
{
int ncase, n, f[4] = {5, 3, 1, 9};
scanf("%d", &ncase);
for (int k=1; k<=ncase; ++k)
{
scanf("%d", &n);
int ans = 0;
if (n<3)
{
// for (int i=0; i<=n; ++i)
// ans += f[i];
printf("Case %d: %d\n", k, f[2-n]);
}
else
{
Mat p;
p.a[0][0] = p.a[3][0] = 3;
p.a[0][1] = p.a[3][1] = 2;
p.a[0][2] = p.a[3][2] = 7;
p.a[1][0] = p.a[3][3] = 1;
p.a[2][1] = 1;
n -= 2;
p = p^n;
// for (int i=0; i<maxn; i++)
// {
// for (int j=0; j<maxn; j++)
// cout << p.a[i][j] << " ";
// cout << endl;
// }
ans += (p.a[3][0]*5)%MOD;
ans += (p.a[3][1]*3)%MOD;
ans += (p.a[3][2]*1)%MOD;
ans += (p.a[3][3]*9)%MOD;
printf("Case %d: %d\n", k, ans%MOD);
}
}
return 0;
}