牛の旅客列車54 - B

/ * 2019年11月16日


 

問題の説明

その後、質問のうち少し学習フェンウィックツリー、非常に興味を持ってlowbit、後。
非負整数nを考えます。注lowbit(x)はバイナリの下でXの最下位ビットに対応する値を示し、
例えば、ビット×1、2、3の最小数は、それぞれ、第1の位置、lowbit(X)は1、2、それぞれ4。sumΣを探している(私は0,2 ^ N =) lowbit(I)。
出力は998の244 353モジュロ答えを引き起こします。データのTセット。
入力説明:
最初の行の整数Tは、データセットの数を表します。
次に、Tラインタイトルに記載された意味に示すように、各整数N、。
出力説明:
Tの出力はそれぞれの問い合わせの結果を表しています。
例えば1
入力
2
2
。4つの
出力
8
48は、
説明
、N = 2、アンス=sumΣ( iは= 0,4)lowbit(I)= 0 + 1 + 2 + 1 + 4 = 8。
備考
T <= 3×10 ^ 5 、n≤10^ 18。
大きくすることができるデータの量を入力し、それを読むためより高速な方法を使用することをお勧めします
* /



/ *
ソリューションの概要:
ANS =(N-+ 1)* 2 ^(N - 1)^ 2 +(1-N-)=(+ N-2)* 2 ^(N - 1);
最初の0〜2 ^ n個奇数のビットが値1を表し、最下位ビット、総和SUM1 = 1 * 2 ^(nは -1)
偶数ビットで表されるビットの最小数の値を見て、それはNのそれぞれに見出すことができます= 1〜nは、2 ^ nは、左右の、1の最下位ビットの値である対称和SUM2 =(N-1)* 2 ^(N-1)+ 2 ^ N =(N + 1)×2 ^(nは-1)
* /

 

1  @ 1:Nので<= ^ 18 10は、%LLD(長い長い、-2 ^ 63-1〜直接読み取ることができ 、符号なしlong長い、0〜2 ^ 64-1- 2 ^ 63-1 ^ ------ 18は10)よりもはるかに大きい
2の#include <ビット/ STDC ++ H.>
 。3  使用 名前空間STD;
 4のtypedef ロング ロングLL;
 5  CONST  INT MOD = 998 244 353 ;
 6  LL fastpow(A LL、LL N- )
 。7  {
 8      LL B = A、= RES 。1 ;
 9      ながら(N){
 10          IF(&N- 1)RES =(B * RES)%MOD;
 11          B =(B * B)%MOD;
 12のIS         N >> = 1 13      }
 14      リターンRES。
15  }
 16  のint main()の
 17  {
 18      INT T。
19      のscanf(" %dの"、&T)。
20      一方(T-- ){
 21          LL N。
22          のscanf(" %のLLD "、&N)
23          であれば(N == 0 ){
 24              のprintf(" %のLLD \ n "1);
25は             続けます26          }
 27           LL TEM = fastpow(2、N- 1 )。
28          N =(N + 2)%のMOD。
29          のprintf(" %のLLD \ n "、(N * TEM)%のMOD)。
30      }
 31      リターン 0 32 }

 

1  // 拓展、N> = 10 ^ 18;用数组读入
2。の#include <ビット/ STDC ++ H>
 3  使用して 名前空間STDを、
4のtypedef 長い LL。
5  のconst  int型のmod = 998244353 ;
6  LLのfastpow(LLのN、LL)
 7  {
 8      のLL B =、RES = 1 9      一方、(N){
 10          であれば(N - 1)RES =(B * RES)%のMOD。
11          、B =(B * B)%のMOD。
12          N >> = 1 13      }
14      リターンのres;
15  }
 16  のint main()の
 17  {
 18      T LL。
19      のscanf(" %のLLD "、&T)。
20      一方(T-- ){
 21          LL N = 0、CNT = 0 22          CHAR S [ 20 ]。
23          のscanf(" %S " 、S)。
24          INTル= STRLEN(S)。
25          であれば(LE == 1つの && S [ 0 ] ==' 0 ' ){
 26              のprintf(" 1つの\ n " );
27は             続けます28          }
 29          のint i = 0 ;
30          一方(le-- ){
 31              N = N * 10 + S [I ++] - ' 0 ' 32              であれば(N> = MOD)CNT = CNT * 10 +(INT)(N / MOD)。
33              他の CNT = CNT * 10 34              N%= MOD。
35         }
 36          II ANS = 1 37          であれば(CNT){
 38              LL TEM = 0 39              TEM fastpow =(2 、V)
40              ANS = fastpow(TEM、CNT- 1 )。
41              であれば(N == 0)= ANS(ANS * TEM / 2)%のV。
42              プレゼンス ANS = ANS *のTEM%のV。
43          }
 44          であれば(N){
 45              LL fastpow TMP =(2、N- 1 )。
46             年=年*%tmpのMOD。
47          }
 48          歳=(*年(N + 2)%MOD)%のMOD。
49          のprintf(" %のLLD \ N " 、年);
50      }
 51      リターン 0 52 }

だけでなく、書き込み後に拡大します

 

おすすめ

転載: www.cnblogs.com/littleyyhome/p/11873058.html