$ P5657 \ [CSP-S \ 2019] $ゴレイコード

\(AC \)難しいことではありませんが、それだけであまりにも神経質な試験を受けた\(95pts \)
この道の私の地方の選挙が開始

\(説明\)

タイトル面
グレイコードは、符号化され(N- \)\:グレイコードは以下のように構成されているビット\(N-1 \)主要グレーコードのビット( "0" \)\ \(^ {0--2 N-1} -1 \)ビットは、その後、\(N-1 \)有力で、逆グレイコードビット\( "1" \)\(2 ^ {N-1 } - 2 ^ N-1 \)ビット特別な、\(1 \)はグレイコードビットである(0 \)\ Q \(N \)グレイコードセクションビット\(kは\)一方が何でありますか


\(解決\)

、クエリの同様のデータ構造上のグレイコードを見つけるプロセスツリー構造を形成するために、グレイコードを書く考えてみましょう\(K \)に起因する位置、\(kは\)からである(\ 0)\我々ので、最初に、始まります彼は\(+ 1 \)
仮説は現在のセクションと見なさ\(I \)ビットで、その結果、\(MID = 2 ^ {I-1} \) もし\(K <=ミッド\)補体(0 \ \ )、または\(K-MID = \) 塗りつぶし\(1 \) 注意\(1 \)ランキングフリップので、並べ替え逆の順序で次のk =半ばK:\(
+ 1 \) 数に注意を払いますポイント:
\(1 \)開くために\(ULL \を)で、(ULL \)\の下に\(X << 63 \)この計算は間違っている、独自の高速パワーを書く
\(2 \)極端なデータ\(K = 2 ^ {64 } -1 \) であれば\(K ++ \)破裂する\(ULL \)となる\(0 \)ので、\(K \)私たちのプログラムの中になることはありません(0 \)\出会いので、\(= 0 \ K) 逆はある(K = 1 \)\直接的に、特別審査員。

\(コード\)

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #define re register
    #define ull unsigned long long
    
    using namespace std;
    
    inline ull read()
    {
        ull x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    string s;
    ull n,k,mid;
    ull quickpow(ull a,ull b)
    {
        ull ans=1;
        while(b)
        {
            if(b&1) ans=ans*a;
            a=a*a;
            b>>=1;
        }
        return ans;
    }
    int main()
    {
        n=read(),k=read();
        mid=quickpow(2,n-1);
        k++;
        while(mid)
        {
            if(k>mid||k==0) 
            {
                s+='1';
                if(!k) k=1;
                else k-=mid,k=mid-k+1;
            }
            else s+='0';
            mid>>=1;
        }
        cout<<s;
        return 0;
    }

おすすめ

転載: www.cnblogs.com/Liuz8848/p/12078133.html