トピックP4317フローラ動的プログラミングの数?デジタルDP

アイデア:デジタル$ DPの$

提出:5(実際には、Aの前に前に、これは二回ACで元のプログラムを調整します。)

ソリューション:

私たちは、$は合計(X)=私は$、$ I $のために、いくつかの$ xには$があり、その後、我々はすぐに電源を解決することができます決定されます。

DP数字$ $のような数で要求されているように。

#include <cstdioを> 
する#include <iostreamの> 
する#include <CStringの>
 に#define ULL符号なし長い長
 の#defineが長い長いちゃう
 の#define RレジスタLL
 使用 名前空間STD。
#define(; iは= 10000000000を<++ I)(R I = 1の場合)一時停止
 の#define freopenはIN( "NOIPAK ++である。"、 "R"、STDIN)
 の#defineアウトfreopenは( "out.out"、」 W」、STDOUT)
 名前空間FREAD {
 静的 チャー B [ 1 << 15 ]、* S = B * D = B。
#ifndefのJACK 
の#define GETCHAR()(S == D &&(D =(S = B)+関数fread(B、1,1 << 15、
#endifの
インラインLL G(){ 
    R RET = 0、=解決1登録のchar chのを。しばらく(!isdigit(CH = getchar関数()))修正= CH == ' - ' - ?1 :修正します。
    もし(CH == EOF)の戻り EOF; DO RET = RET * 10 +(CH ^ 48)。一方、(isdigit(CH = GETCHAR()))。リターンのRET *の修正。
}インラインブールのisEmpty(CONST  チャー&CH){ リターン(CH <= 36 || CH> = 127 );}
インラインボイド GS(チャー *のS){ 
    登録チャー CHと、一方(のisEmpty(CH = GETCHAR()))。
    やる * S ++ = CHを; しばらく(!のisEmpty(CH = getchar関数())); 
} 
} 使用 FREAD :: Gと、使用FREAD :: GSを。

名前空間Luitaryi {
 CONSTの 整数 N = 51、M = 1E7 + 7 
LLのn; 
INT LEN、NUM [N]。
LL F [N]、[N]。
インラインint型 qpow(-1,11,11-のP){R RET = 1%= M。
    にとって(; P; P >> = 1、(A * = A)%= M)IF(P&1。 )(RET * = A)%= M; リターンRET; 
} 
インラインLL DFS(int型の L、BOOL UL、INT C、INT D){ // L:長さ、UL:上限タグ、C:番号1、Dカウント:要求の数をD =)を(すなわち、この時点で、我々は(X SUMを行う)
    IF(L! )戻り C == D、
     IF!(UL &&〜F [L] [C])を返すF [L] [C]を、
    R&LTリム =(UL NUM [L]:?1)、CNT = 0 ;
     のための(R&LT = I 0、I <=イム; ++ I)
        CNT + = DFS(L- 1。、UL && I == LIM、C + I、D)。
    戻り?UL CNT:F [L] [C] = CNTと、
} 
インラインintは(LL n)を解く{R ANS = 1 (; T; N >> = 1)NUM [++ LEN = N&1 以下のための(R i = 1 ; iは= LEN <; ++ I)
        のmemset(F、0xffではsizeof (F))、
        ANS =(ANS * qpow(I、DFS(LEN、0、I)))%M;
    戻るANSを。
} 
インラインボイドメイン(){ 
    N = G(); printf("%D \ n " (n)を解く); 
} 
} 
(){主署名さ
    Luitaryi ::メイン(); 戻り 0 ; 
}

2019年7月21日

 

おすすめ

転載: www.cnblogs.com/Jackpei/p/11223484.html