Sicily 1735 Encryption (模拟)

链接:http://soj.me/show_problem.php?pid=1735&cid=

Description

Let me introduce an easy method of encryption to you.

Suppose there’re N bytes (1 byte = 8 bits) data that are to be encrypted and we want to encrypt them in groups of M bytes, while for the last group we may need to add some zeros to make up M bytes. Then we find out an M * M matrix (Aij) m*m. Now for each group,
suppose M bytes are X1, X2, …, Xm, and we will generate the encrypted data Y1, Y2, …, Ym from the following equations :

Yi = (X1 * Ai1) + (X2 * Ai2) + … + (Xm * Aim)

i = 1 , 2 , 3 , … , m .

Input

There are multiple cases.

For each case, there are two numbers N and M (1<=N<=100, 2<=M<=10) in the first line. In the second line are N numbers to be encrypted (between 0 and 255). While in the following M lines, each line contains M numbers and the jth number in the ith line of these
M lines is Aij (0 <= Aij <= 255). Numbers in the same line are separated by spaces.

Input will be ended by end of file.

Output

For each case, output one line of the encrypted data. If the encrypted data contains K numbers, use K-1 spaces to separate them.

Sample Input

 Copy sample input to clipboard

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

Sample Output

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;
}

Sicily 1735 Encryption (模拟),布布扣,bubuko.com

时间: 2024-10-11 05:10:27

Sicily 1735 Encryption (模拟)的相关文章

深入分析java序列化

概念 先来点简单的概念: what?why? 什么是序列化?为什么要序列化? 答曰:将java对象转成字节序列,用以传输和保存 where? 使用场景是什么? 答曰:对象的传输:状态的备份,例如jvm的dump文件: 好了,不装*了,下面说的详细点.其实对象的序列化主要有两种用途: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 在网络上传送对象的字节序列 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Sessio

java 的序列化和反序列化的问题

引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ObjectInputStream 和 ObjectOutputStream 进行对象的读写.然而在有些情况下,光知道这些还远远不够,文章列举了笔者遇到的一些真实情境,它们与 Java 序列化相关,通过分析情境出现的原因,使读者轻松牢记 Java 序列化中的一些高级认识. 回页首 文章结构 本

序列化与transient

满足下面四个条件中的一个的类就不应该被序列化:  1.一个类与本地代码(native code)有紧密的关系,如java.util.zip.Deflater,这个类中很多都是native的. 2.对象的内部状态依赖于java虚拟机或者运行状态,从而每次运行时状态都可能是不同的.例如Thread,InputStream等. 3.串行化可能带来潜在的安全隐患,如java.lang.SecurityManager,java.security.MessageDigest等. 4.一个类全是静态方法,没有

java serializable深入了解

一.串行化的概念和目的 1. 什么是Serialization? 串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件.内在缓冲区等)中或是以二进制方式通过网络传输.之后可以通过反串行化从这些连续的位数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样. 2. 为什么要Serilzation? 特别地,串行化主要有三种用途: 1)作为一种持久化机制 如果使用的是FileOutputStream流的方式,则

通俗理解序列化的高级知识

如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件.那你最好再阅读该篇文章,文章对序列化进行了更深一步的讨论,用实际的例子代码讲述了序列化的高级认识,包括父类序列化的问题.静态变量问题.transient 关键字的影响.序列化 ID 问题.在笔者实际开发过程中,就多次遇到序列化的问题,在该文章中也会与读者分享. 引言 将Java对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实

【Java】Java 序列化的高级认识

如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件.那你最好再阅读该篇文章,文章对序列化进行了更深一步的讨论,用实际的例子代码讲述了序列化的高级认识,包括父类序列化的问题.静态变量问题.transient 关键字的影响.序列化 ID 问题.在笔者实际开发过程中,就多次遇到序列化的问题,在该文章中也会与读者分享. 15 评论: 杨 硕, 研究生, 东北大学软件学院 魏 强, 硕士研究生, 东北大学软件学院 2011 年 3 月 16 日 内容 引言 将 Java 对象序列

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

Serializable与Parcelable

Java 序列化的高级认识 如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件.那你最好再阅读该篇文章,文章对序列化进行了更深一步的讨论,用实际的例子代码讲述了序列化的高级认识,包括父类序列化的问题.静态变量问题.transient 关键字的影响.序列化 ID 问题.在笔者实际开发过程中,就多次遇到序列化的问题,在该文章中也会与读者分享. 引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发

Java序列化系列教程(下)

一引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ObjectInputStream 和 ObjectOutputStream 进行对象的读写.然而在有些情况下,光知道这些还远远不够,文章列举了笔者遇到的一些真实情境,它们与 Java 序列化相关,通过分析情境出现的原因,使读者轻松牢记 Java 序列化中的一些高级认识. 1.1serial