首页 > 学院 > 开发设计 > 正文

Decryption sequence [模拟]

2019-11-06 06:15:28
字体:
来源:转载
供稿:网友

加密是个被广泛关注的问题,现在给出一种对数列加密的算法:

假设有原数列S,S是1到2n2n的一个排列(下标从1开始),因此其中共有2n2n个整数。

现在定义一个数列P,满足:

Pi={ji(Simod2=1且Sj=Si+1)(否则) Pi={j(Simod2=1且Sj=Si+1)i(否则)

同时我们通过以下操作由S生成另一个数列T:第一步将S所有奇元素删除,第二步把剩下的所有偶元素按照原来的位置关系排列好,并都除以2,这样得到一个新的数列。

例如:

对于数列S={4,8,3,2,5,7,1,6},我们可以生成数列P={1,2,1,4,8,2,4,8},数列T={2,4,1,3}。

我们把数列P称为密文,T称为密钥,顾名思义通过这两个数列,可以还原出原数列。

现在请你完成数列的解密程序。

输入 多组测试数据(不超过10组),请处理到文件结束。

第一行是一个正整数m(0

#include<cstdio>#include<cstring>int p[110],t[110],ans[110];int m;void init(){ for (int i = 1; i <= m; ++i){ p[i] = i; }}int main(){ while (~scanf("%d",&m)){ init(); memset(ans,0,sizeof(ans)); memset(t,0,sizeof(t)); for (int i = 1; i <= m; ++i) scanf("%d",&p[i]); for (int i = 1; i <= m/2; ++i){ scanf("%d",&t[i]); t[i] *= 2; } int k = 1; for (int i = 1; i <= m; ++i){ if (p[i] == i){ ans[p[i]] = t[k++]; } } for (int i = 1; i <= m; ++i){ if (!ans[i]){ ans[i] = ans[p[i]] -1; } } for(int i = 1; i <=m; ++i){ if (i == 1) PRintf("%d",ans[i]); else printf(" %d",ans[i]); } printf("/n"); } return 0;}

根据题意来就好 可能p的定义不好理解 静下心好好去想就行


上一篇:7.基因牛

下一篇:6.猜数字

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表