タイトル説明
$ 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 。 }