アイデア:デジタル$ 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日