链接:http://soj.me/show_problem.php?pid=1735&cid=
4 2
1 2 3 4
0 1
1 0
1 2
1
3 1
0 1
10 10
100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1
2 1 4 3
3 0
100000 100 100 100 100 100 100 100 100 100
分析: 这道题是一个矩阵加密算法的实现,所谓矩阵加密就是把要加密的数据作为一个向量,乘以一个矩阵,得到的就是被加密的内容,如果需要解密,就乘以一个逆矩阵而还原,这道题直接按题意做加密的处理就可以了;
题目中给出了求Y的公式,而且数据范围也不大,直接根据公式代入就得啦;
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#include <vector>
#include <string>
#define MAXN 120
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;
int ans, n, m;
int data[MAXN], x[11], a[11][11];
void Init()
{
RST(data);
for(int i=1; i<=n; i++) cin >> data[i];
for(int i=1; i<=m; i++) {
for(int j=1; j<=m; j++) {
cin >> a[i][j];
}
}
return ;
}
void solve()
{
for(int i=1; i<=m; i++) {
ans = 0;
for(int j=1; j<=m; j++) ans += a[i][j]*x[j]; //根据公式代入;
cout << ans;
if(i < m) cout << " ";
}
}
int main()
{
while(cin >> n >> m) {
for(int i=1; i<=n; i+=m) {
if(i > 1) cout << " ";
for(int j=0; j<m; j++) x[j+1] = data[i+j]; //计算x;
solve();
}
cout << endl;
}
return 0;
}