PKU 2144 Leaky Cryptography 题解

PKU 2144 Leaky Cryptography 题解

把所有数字用%x读进来
然后按二进制从第一个开始依次处理就好了
每次先判断这个k的这个位置是0是否可以满足题意如果不可以那便是1
然后每次做一个验证就可以了

  
  
  
  
 1 #include < stdio.h >
 2 int  a[ 8 ],b[ 32 ];
 3 int  main()
 4 {
 5int KASE,i,sum,t,ans,j,l;
 6scanf("%d",&KASE);
 7while(KASE--)
 8{
 9for(i=0;i<32;i++)b[i]=0;
10for(i=0;i<8;i++)scanf("%x",&a[i]);
11//    for(i=0;i<8;i++)printf("%d ",a[i]);printf("\n");
12scanf("%x",&sum);ans=0;
13for(i=0;i<32;i++)
14{
15t=0;
16for(j=0;j<8;j++)t+=(a[j]^0)&1;
17t=(t+ans)&1;
18if(t==(((sum)^0)&1))b[i]=0;
19else b[i]=1;
20//printf("%d %d %d %d\n",t,(((sum)^0)&1),b[i],i);
21t=0;
22if(b[i]==1)for(j=0;j<8;j++)t+=(a[j]^1)&1;
23else for(j=0;j<8;j++)t+=(a[j]^0)&1;
24for(j=0;j<8;j++)a[j]=a[j]>>1;
25ans=(ans+t)>>1;
26sum=sum>>1;
27}

28ans=0;
29for(i=31;i>=0;i--)
30{
31ans=ans+(b[i]<<i);
32//printf("%d",b[i]);
33//    if(i%4==0)printf(" ");
34}

35//    printf("\n");
36printf("%x\n",ans);
37}

38return 0;
39}

40

你可能感兴趣的:(PKU 2144 Leaky Cryptography 题解)