#4508。トリプルI

タイトル説明

$ A $知られ、あなたは数$ mの$を選択することができ、$ $ 3、$ M $の各数倍または$ $の数を満たしています。

再び$ mの$を最小限に抑えることができます。

データ範囲

$、$ T \ル10 ^ 5 $、$ A \ル10 ^ {18} $の$ \ 100%のデータ。

問題の解決策

問題の創発

$ $ $ A $ 3の倍数は、その後、$ A $を直接使用することができる場合

数アップまたはそれ以外は$ $の2つの$ 3 $倍数を使用しての可能性を検討します

$ A $分割位置、明らかに$ 2 ^ iは、そのよりもサイドを取る、$ 2 $離れた位置に$ 1 $と$ \%3 $へ%3 = 1/2 $ので、$ \%3つの$を\それは反対側に配置することができるように、両側の差が$ 1 $を超えることができないまで、二つの数字が一緒になって、上記の動作が繰り返されます

コード

#include <ビット/ STDC ++ H>
 に#define _(d)の一方(D(isdigit(C = GETCHAR())))
のtypedef 長い  LL。使用してのstd ::スワップを。
LL R(){ チャー C; _(!); LL X = C ^ 48 ; _()X =(x << 3)+(X << 1)+(C ^ 48)。リターンX;}
 int型 Tを、T [ 2 ]、M、U、V、LL、P [ 2 ] [ 65 ]、X、Y、J。
INT メイン(){
     (scanf関数(" %のD "、&​​T); T-- ;){ 
        A = R();
        もし(%3 == 0){のprintf(" 1%LLDする\ n "、A)。引き続き;} 
        J = 1 ; T [ 0 ] = tの[ 1 ] = 0 ;
        int型 iは= 0 ; J <= A iが++、J << = 1 であれば(&J)P [I&1 ] [++ T [I&1 ] = J。
        uが = 0 ; V = 1もし(T [ 0 ]> T [ 1 ])スワップ(U、V)。
        一方(T [V] -t [U]> 1
            P [U] [ ++ T [U] = P [V] [T [V] | P [V] [T [V] - 1 ]、T [V] - = 2 
        uが = 0 ; V = 1もし(T [ 0 ]> T [ 1 ])スワップ(U、V)。
        X = 0、Y = 0以下のためにint型 I = 1 iは++; I <= T [U] 
            xは =(P [U] [I] | | P [V] [i])と、Y | =(P [U] [I] | P [V] [iが+ 1 ])。
        printf(" 2%LLD%のLLDを\ n " 、x、y)は、
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/xjqxjq/p/11370163.html
おすすめ