bzoj4917: Hash Killer IV

来源:互联网 发布:人工智能不是威胁辩论 编辑:程序博客网 时间:2024/05/22 05:06

传送门
话说标准题解里要用扩欧?
我太弱了,想不出来用扩欧怎么做。
然后我就自己yy了一个做法:
每一次总有某些二进制位上不会改变。
然后根据这些不会改变的位置推出其他改变过后的位置。
这种做法好像是对的?
反正b站上A了就当他是对的
时间复杂度O(QlogAi)

#include<cmath>#include<cstdio>  #include<cstdlib>#include<cstring>  #include<iostream>#include<algorithm>using namespace std;unsigned int q,t,bin[35];int main(){    scanf("%u",&q);    bin[0]=1;    for (int i=1;i<=31;i++)        bin[i]=bin[i-1]*2;    while (q--){        scanf("%u",&t);        for (int i=0;i<=15;i++)            t-=((t/bin[i])&1)*bin[i+16];        //printf("%u ",t);        for (int i=31;i>=11;i--)            t^=((t/bin[i])&1)*bin[i-11];        //printf("%u ",t);        for (int i=0;i<=28;i++)            t-=((t/bin[i])&1)*bin[i+3];        //printf("%u ",t);        for (int i=31;i>=6;i--)            t^=((t/bin[i])&1)*bin[i-6];        //printf("%u ",t);        for (int i=0;i<=21;i++)            t-=((t/bin[i])&1)*bin[i+10];        printf("%u\n",t);    }}