HDU3734 F(X)

タイトル説明

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

出力

最初は、引用符なし:すべてのケースのために、あなたは出力「ケース#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)を、
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/sto324/p/11206620.html