デジタルDP CodeForces - 55Dデジタル美しさ

美しい数字のCodeForces - 55D 

質問の意味:、範囲指定した間隔で美しさを求めている桁数を美しいとして割り切れる自分のデジタル数字のすべてを定義することができます。

分析:まず第一に、あなたが前にすべての桁に制限を置くことができるの最大公倍数のDFS条件とDP添字としてアップし、POS、合計、LCM、その後、  DP [POS] [合計] [ LCA] [アップ] これは表し後の位置posをすべてトラバースした後、状態はこの合計の最大値をとりますこの問題を回避するために、それはないDP 15 [POS = 1] [和=から、12〜15であり、そして 0] [UP = 1] 12のメモリに直接DP [= 1 POS] [和= 0] [アップ= 1]、およびDPビットの数、したがって、時間複雑さのメモリを削減する必要性、二つの効果まで、即ち、位置決意は、いくつかのデジタル横断することができるがあり、15 DP [1]定義される飽和([0] [0]をメモリに戻し12であった[1] DP DPを選択15、DP 15 [1] 12とDPを避けるため)、その後、時刻使用のメモリを使用するDPであります[0] = 10、つまり、最大= 0で、これは完璧なソリューションです。そして、あなたは他のメモリが大幅に時間の複雑さを軽減、使用することができ、一度にmemsetを使用することができます。

次いで、アレイは2520から9には大きすぎる開口部、及び1の公倍数であるため、MLEは、実測値[SUM] 2520が開口2520限り、大きな弾性率(関連する数論)を使用するように、最大値として見ることができます。そう数を9に位置、1の公倍数の多くをかけていないと、[LCA]、使用する必要がある離散確立、ハッシュ配列、配列演算DP、[LCA】位置の値を配列CNTに変換ハッシュラインで、おそらくこの図50。

LCM(a、b)は= / GCD(a、b)は* Bも見ることができます

#include <cstdioを> 
する#include <CStringの> 
する#include <cmath> 
の#include <iostreamの> 
する#include <アルゴリズム>
 使用して 名前空間STDを、

typedefの長い 長いLL。
CONSTの INT MAXN = 32 const  int型のMod = 2520 ; 
LL N、M。
INT [MAXN]掘ります。
LL DP [MAXN] [ 2550 ] [ 50 ] [ 2 ]。
int型のハッシュ[ 2550 ]; 

int型 GCD(INT A、INT B){
    場合(Bの== 0を返します戻り GCD(B、%のB)。
} 
INT LCM(INT A、INT B){
     返す *(B)/ GCDをB。
} 

LL DFS(int型の POS、int型の和、int型 LCM、BOOL アップ){
     // のprintf( "状態=%D%D%D%D \ n"は、POS、和、LCM、アップ)。
    もし(POS < 0リターン和%のLCMの== 0 もし(アップ&& DP [POS] [和] [ハッシュ[LCM] [最大] =! - 1 ){ 
        のprintf(" DP%D%D%D%D =%d個の\ n " 、POS、和、アップLCM、DP [POS] [和] [ハッシュ[LCM] [最大])。
        返すDP [POS] [合計]を[ハッシュ[LCM]]、[アップ]; 
    } 
    LL RES = 0 以下のためにint型 i = 0 ; iが<= 9 ; I ++ ){
         場合(==最大1 && I> DIG [POS])破りますint型 TLCM = LCM;
        もし(I)TLCM = LCM(TLCM、I)。
        RES + = DFS(POS- 1、(SUM * 10 + I)%MOD、iは== TLCM、最大&& 掘る[POS])。
        //printf( "RES =%のLLDを\ n"、RES)。
    }
     であれば(最大)DP [POS] [和] [ハッシュ[LCM] [最大] =のRES。
    リターンのres; 
} 

LLゾル(LLのX){ 
    場合(X < 0戻り 0 ;
    // のmemset(DP、-1、はsizeof(DP))。
    int型 CNT = 0 ;
    一方、(X){ 
        [CNT掘る ++] = X%10 
        X / = 10 
    } 
    戻り DFS(CNT- 1011 )。
} 

int型メイン(){
     int型のT。
    CIN >> T;
    int型 CNT = 0 ;
    以下のためにint型私= 1 ; iが=モッドを<; Iは++ ){
         場合(MODは、%I == 0 ){ 
            ハッシュ[I] = CNT ++ 
        } 
    } 
    // のprintf( "ハッシュ=%d個の\ n"、ハッシュ[126])。
    memsetの(DP、 - 1はsizeof (DP))。
    一方、(T-- ){ 
        CIN >> N >> M。
        COUT <<ゾル(M)-sol(N- 1)<< ENDL。
    } 
}

 

おすすめ

転載: www.cnblogs.com/-Zzz-/p/11415938.html