传送门
话说标准题解里要用扩欧?
我太弱了,想不出来用扩欧怎么做。
然后我就自己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);
}
}