タイトル説明
n桁(A 10進数xに対して
N
A
N-1
、A
N-2
...
2
A
1
)、我々は、Fとしてその重量を定義する(X)=
N
* 2
N-1
+ A
N-1を
* 2
のn-2
+ ... +
2
* 2 +
1
* 1。今、あなたは、2つの数AとB与えられ、その重量以上のものではありません、包括的、0とBの間がありますどのように多くの数字を計算して下さいF(A)。
入力
最初の行は、テストケースの数を示し、T(T <= 10000)番号を有しています。
各テストケースのために、2つの数Aがであり、B(0 <= A、B <10 9 )
各テストケースのために、2つの数Aがであり、B(0 <= A、B <10 9 )
出力
最初は、引用符なし:すべてのケースのために、あなたは出力「ケース#tを」必要があります。
tは
1次に、出力答えから始まるケース番号です。
問題の解決策
以上4,599をわずか9ビット数、F(X)の値である観察されないことができ、F状態を得ることが容易に可能である[POS] [和]
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 int型の T、POW2 [ 15 ]。 int型、B; INT LEN、NUM [ 10 ]。 INT [F 10 ] [ 10000 ] [ 2 ]。 ボイド get_fa(INT&A ){ int型のx = 0、CNT = 0 ;; 一方、(a)は、{ X + = POW2 [CNT ++] *(%10 )。/ = 10 。 } A = X。 } INT DFS(INT S、int型の和、ブールLIM){ 場合(和> a)に戻り 0 。 もし(S!)リターン 1 。 もし(F [S] [和] [LIM] =! - 1)リターンF [S] [和] [LIM]。 int型のmx = LIM?NUM [S]:9 。 int型 RET = 0 ; 以下のために(int型 i = 0 ; I <= MX; iは++ ) RET + = DFS(S- 1、和が+ iがPOW2を* [S- 1 ]、LIM && I == MX)。 リターン [S] [和] [LIM] = FをRET。 } INT CX(INT X){ LEN = 0 。 一方、(X){ NUM [ ++ LEN = X%10 。 X / = 10 。 } のmemset(F、 - 1、はsizeof (F))。 戻る DFS(LEN、0、真の); } ボイドニース(int型I){ scanf関数(" %d個の%のD "、&、&B)。 get_fa(A)。 //printf( "%d個の\ n"、A)。 printf(" ケース#%dを:%dは\ nを" 、I、CX(b)参照)。 } int型のmain(){ POW2 [ 0 ] = 1 。 以下のために(int型 i = 1 ; iは= < 10 ; I ++)POW2を[I] = POW2 [I- 1 ] * 2 。 scanf関数(" %のD "、&T)。 以下のために(int型 I = 1 ; I <= T;私は++ )素敵な(i)を、 }
アウトそして狂気のTTTTTTT
データのセットごとに、fは初期化されますので、恥知らずなブログを見に行った後、
アレイの状態を変更することが見出され、2番目のビットは次のように定義されるFとの差(x)は、それが最初に初期化される必要があるが、この寸法は、LIMを開くことができません
単純に素晴らしいああ
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 int型の T、POW2 [ 15 ]。 int型、B; INT LEN、NUM [ 10 ]。 INT [F 10 ] [ 4600 ]。 ボイド get_fa(INT&A ){ int型のx = 0、CNT = 0 ;; 一方、(a)は、{ X + = POW2 [CNT ++] *(%10 )。/ = 10 。 } A = X。 } INT DFS(INT S、int型の和、ブールLIM){ 場合(合計< 0)戻り 0 ; もし(S!)リターン 1 。 もし - (LIM && F [S] [和] =!1)リターン[S] [和] F。 int型のmx = LIM?NUM [S]:9 。 int型 RET = 0 ; 以下のために(int型 i = 0 ; I <= MX; iは++ ) RET + = DFS(S- 1は、和-iはPOW2を* [S- 1 ]、LIM && I == MX)。 もし(!LIM)F [S] [和] = RET。 リターンRET; } INT CX(INT X){ LEN = 0 。 一方、(X){ NUM [ ++ LEN = X%10 。 X / = 10 。 } 戻り DFS(LEN、真の); } ボイドニース(int型I){ scanf関数(" %d個の%のD "、&、&B)。 get_fa(A)。 // のprintf( "%d個の\ n"、A)。 printf(" ケース#%dを:%dは\ nを"、I、CX(b)参照)。 } int型のmain(){ POW2 [ 0 ] = 1 。 以下のために(int型 i = 1 ; iは= < 10 ; I ++)POW2を[I] = POW2 [I- 1 ] * 2 。 memsetの(F、 - 1、はsizeof (F))。 scanf関数(" %のD "、&T)。 以下のために(int型 I = 1 ; I <= T;私は++ )素敵な(i)を、 }