/ * 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 }
だけでなく、書き込み後に拡大します