bzoj4917 [ lydsy6月月赛A题 ]

来源:互联网 发布:比特币交易网免费源码 编辑:程序博客网 时间:2024/05/21 09:32

观察到t的二进制的某些位在有些操作后是不变的。倒着推,求出这几位的值再求其他位,一直做就可以了。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 33#define UI unsigned intUI n,p[N];int i,Q;inline char nc(){    static char buf[100000],*p1=buf,*p2=buf;    if(p1==p2){        p2=(p1=buf)+fread(buf,1,100000,stdin);        if(p1==p2)return EOF;    }    return *p1++;}inline void Read(UI& x){    char c=nc();    for(;c<'0'||c>'9';c=nc());    for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());}int main(){    for(p[0]=i=1;i<N;i++)p[i]=p[i-1]<<1;    scanf("%d",&Q);    while(Q--){        Read(n);        for(i=0;i<=15;i++)n-=((n/p[i])&1)*p[i+16];        for(i=31;i>=11;i--)n^=((n/p[i])&1)*p[i-11];        for(i=0;i<=28;i++)n-=((n/p[i])&1)*p[i+3];        for(i=31;i>=6;i--)n^=((n/p[i])&1)*p[i-6];        for(i=0;i<=21;i++)n-=((n/p[i])&1)*p[i+10];        printf("%u\n",n);    }    return 0;}
原创粉丝点击