加密是個被廣泛關注的問題,現在給出一種對數列加密的算法:
假設有原數列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) 根據題意來就好 可能p的定義不好理解 靜下心好好去想就行新聞熱點
疑難解答