描述
让我介绍一种简单的加密方法。
假定这有N字节(1字节=8位)的数据需加密,我们将它分成M字节的组,对最后一组可能要加一些0使它具有M字节,然后我们找出M×M的矩阵(Aij),现在对每一组,假定M字节是X1,X2,…,Xm,我们使用下面的公式产生加密数据Y1,Y2,…,Ym:
Yi=(X1*Ai1)+(X2*Ai2)+…+(Xm*Aim)
i=1,2,3,…,m
输入
这儿有多个用例。
对每个用例的第一行,有两个数N和M(1≤N≤100,2≤M≤10),第二行是N个需加密的数(在0到255之间),然后的M行,每行包含M个数,第i行上的第j个数是Aij(0≤Aij≤255),同一行上的数用空格分开。
输出
对每个用例,输出一行加密的数据,如果加密数据包含K个数,使用K-1个空格来隔开。
样例输入
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
怎么wrong 了?
代码:
#include <iostream> using namespace std; int main() { int n,m,a[256],b[256][256],i,s[256],j,k,t; while(cin>>n>>m) { memset(b,0,sizeof(b)); memset(s,0,sizeof(s)); memset(a,0,sizeof(a)); for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<m;i++) for(j=0;j<m;j++) cin>>b[i][j]; k=0;t=0; //将情况分为3种情况 n>m n<m n==m; if(n>m) { for(i=n-m;i<n;i++) { for(j=n-m;j<n;j++) { b[i][j]=b[k][t++]; } k++;t=0; } for(i=0;i<n;i++) { for(j=0;j<n;j++) { s[i]+=(a[j]*b[i][j]); } } for(i=0;i<n-1;i++) cout<<s[i]<<" "; cout<<s[i]<<endl; } else if(n<m) { for(i=0;i<m;i++) for(j=0;j<m;j++) s[i]+=(a[j]*b[i][j]); for(i=0;i<m-1;i++) cout<<s[i]<<" "; cout<<s[i]<<endl; } else { for(i=0;i<m;i++) for(j=0;j<m;j++) s[i]+=(a[j]*b[i][j]); for(i=0;i<m-1;i++) cout<<s[i]<<" "; cout<<s[i]<<endl; } } return 0; }
求解啊。。。
看题目意思感觉到是矩阵的乘法。。。结果试了半天,想了半天才想起来矩阵的乘法。。。。给你个测试例子吧。
/* 4 2 1 2 3 4 0 1 1 0 */ #include <iostream> #include <cmath> using namespace std; int main(int argc, char* argv[]) { int N = 4; int M = 2; int A[2][2] = {{0,1},{1,0}}; int X[4] = {1,2,3,4}; int XX[2][2]; for (int i=0,k=0; i<M; i++) { for (int j=0; j<M; j++,k++) { XX[i][j] = X[k]; } } int YY[2][2]; for (int i=0; i<M; i++) { for (int j=0; j<M; j++) { YY[i][j] = 0; for (int k=0; k<M; k++) { YY[i][j] += XX[i][k]*A[k][j]; } cout << " " << YY[i][j]; } } return 0; }
代码不好解释,我就用例子说明矩阵的乘法吧。
题目意思是先得到MxM的矩阵XX(根据X拆分而来),如X={1,2,3,4},则XX为{{1,2},{3,4}}。
然后输入矩阵MxM的矩阵A为{{0,1},{1,0}}。
YY就是要计算出来的结果:YY=XX*A。
矩阵乘法公式:YY(i,j) = XX(i,0)*A(0,j) + XX(i,1)*A(1,j) + .. XX(i,M-1)*A(M-1)。
最后将YY展开成一维数组Y就是这题目的结果了。。。矩阵乘法公式自己记忆起来的,有问题谷歌查查吧。。。
YY(0,0) = XX(0,0)*A(0,0) + XX(0,1)*A(1,0) = 1*0+2*1 = 2
YY(0,1) = XX(0,0)*A(0,1) + XX(0,1)*A(1,1) = 1*1+2*0 = 1
YY(1,0) = XX(1,0)*A(0,0) + XX(1,1)*A(1,0) = 3*0+4*1 = 4
YY(1,1) = XX(1,0)*A(0,1) + XX(1,1)*A(1,1) = 3*1+4*0 = 3
谢谢。