•参考資料
[1]:淡トレースドリーム
[2]:忘れ
[3]:マイCSDN
•問題の意味
パーソナル円n、パケット2の数、回数Xデキューの数を見つけ、メッセージを残します。
•ボーエンの理解[1]
最初のラウンドは、xが奇数である場合、xは、チームの最初のラウンドである必要があり、特定の奇数をデキューANS =(X + 1)/ 2。
xが奇数でない場合は、次のように処理が行われます。
1つの 一方(のx%2 == 0 ) 2 { 3 X / = 2 。 4 もし(N - 1 ) 5 X ++ 。 6つの ANS + = N / 2 。 7 N - = N / 2 。 8 }以下は、コードの動作を説明します。
①xが偶数であれば、最初のラウンドでのチームではなく、さらに、Xおよびチーム、X / 2の番号の合計の前に、
②nが偶数の場合、CPCの最初のラウンドは、n / 2個を残して、N / 2個デキューデキュー、xはX / 2の番号の残りの数字です。
第二ラウンドでチーム、残りのn / 2①②に対応する最初の数は、上記処理を繰り返す番号依然としてデキューの残りの数;
nが奇数の場合、CPCのデキューの最初のラウンドは、n / 2個を残して、N / 2 + 1が番号付けされデキュー。
しかし、第二ラウンドでは、この残りのn / 2番のチーム、最初のチームIDは、もはや上記プロセス②異なる第一の数、第二の数はなく、されていません。
これは、どのように処理することができますか?
非常に良いチームの最初のラウンドで実行し、そのチームの最後の数nはチームの最初のチームの位置の第二ラウンドに、そしてチームの番号の第二ラウンドは、最初は外にまだあります最初の数です。
上記の手順を繰り返す①②続いて、前+1に基づいて変形の残りの数です。
•コード
コードの表示1の#include <ビット/ STDC ++ H.> 2 使用して 名前空間STD; 3 の#define LL長いロング 。4 。5 LLのN-、X; 6 int型Q; 7 。8 LL(解決) 9 { 10 LL ANS = 0 ; 11 LL = CUR N-; 12は 、一方(X%2 == 0 ) 13は 、{ 14 、X / = 2 ; /// コンセンサス前X X / 2は、番号 15 IF(&CUR 1)///電流が奇数残りの場合は、次のデキューとして最後番号 16 X ++ ; 17の ANS + = CUR / 2 ; 18は、 CUR - = CUR / 2 ; 19 } 20 ANS + =(Xの+ 1 /)2 。 21は 戻りANSを、 22である } 23れる INT ()は、メイン 24 { 25 scanfの(" %Dの%のLLD "、およびN-、&Q); 26は、 一方(Q - ) 27 { 28 scanfの(" %のLLD "、&x)は、 29 のprintf(" %LLDする\ n " 、解決())。 30 } 31 リターン 0 。 32 }
•ボーエンの理解[2]の
Dapperのコード、TQL!
xが奇数でない場合、xは間違いなくこのラウンドではチームではなく、X-偶数チームのこのラウンドではなくなった前。
それは、次に、X / 2 n個の尾部に番号に対応する増加、xは尾数となり、デキューに番号付けされていないX / 2です。
以上の処理が実行されます。
•コード
コードの表示1の#include <ビット/ STDC ++ H.> 2 使用して 名前空間STD; 3 の#define LL長いロング 。4 。5 LLのN-、X; 6 int型Q; 7 。8 LL(解決) 9。 { 10 ながら(Xの%2 == 0 ) 11 X + = N-X / 2 ; /// X / 2尾に追加番号、尾数xとなり、xは最初のラウンドでチームかどうかを判定することができる 12は 戻り X / 2 + 1。; 13であります } 14 のint main()の 15 { 16 scanf関数(" %のLLD%dの"、&N、&Q)。 17 一方(q-- ) 18 { 19 のscanf(" %のLLD "、&x)は、 20 のprintf(" %LLDする\ n " 、解決())。 21 } 22 リターン 0 。 23 }