第40次CSP第二题——数字变换 题目网址https://sim.csp.thusaac.com/contest/40/problem/1以下解答仅供参考#include iostream #include vector using namespace std; const int MAXM1e31; const int MAXN5e51; const int MAXA191; int f(int x,int k){ return (((x*xk*k)%8)^k); } //正推 312 4 7 0 --(trans)-- 7 7 0 504 int z_trans(int x,int k){ int a(x6)7; int b(x3)7; int cx7; int hib; //高位 int mic^f(b,k); //中位 逆推可以得到cmi^f(b,k) int dia^f(c,k); //低位 逆推可以得到adi^f(c,k) return (a6)|(b3)|c; } //逆推 504 7 7 0 --(trans)-- 4 7 0 312 int trans(int x,int k){ int hi(x6)7; //高位 int mi(x3)7; //中位 int dix7; //低位 int bhi; int cmi^f(b,k); int adi^f(c,k); return (a6)|(b3)|c; } int main(){ int n,m; cinnm; vectorint k(MAXM); for(int i1;im;i){ cink[i]; } vectorint a(MAXN); for(int i1;in;i){ cina[i]; } vectorint input(MAXA); for(int i0;iMAXA;i){ input[i]i; } //解密用逆变换从最后一轮k[m]开始往前推 for(int im;i1;i--){ for(int x0;xMAXA;x){ input[x]trans(input[x],k[i]); } } for(int i1;in;i){ coutinput[a[i]] ; } return 0; }运行结果