涼しい日陰を楽しんで、いくつかのトピックを磨くことを望んでいた、この質問はトピックの番号に電話する権利を有するが、実際には、デジタルチャンネルDPことです。
SUMので、(私は)を表し 、私 のバイナリ表現数を、そしてデータ範囲は非常に大きいですが、それは1E15で、暴力は絶対に不可能です。
しかし、我々はそこに、数進数1の多くが同じである必要があります、各kについて、考慮に問題を取るバイナリを見つけることができることを知って、kの1の数がどのように多くのですがあります。
私たちは、Nは、それだけで50を見ている、バイナリワードに変換することがわかりました。だから、せいぜい50〜1、各kの50から1へ、kは再びそれを見つける、寄託の数を見てください。
どのように多くの----->デジタルDPがあるのk 1の2進数を識別するための番号の範囲のために:に問題があります。
#include <ビット/ STDC ++ H> に#define LL長い長 の#define MOD 10000007 使用して 名前空間STDを、 LL読んで() { LL、X = 0、F = 1。チャー S = GETCHAR()。 一方、(S < ' 0 ' || S> ' 9 '){ もし、(S == ' - ')、F = - 1 ; S = GETCHAR();} 一方、(S> = ' 0 ' && S <= ' 9 '){X = X * 10 + S- ' 0 ' ; S = GETCHAR();} 戻りのx *のF。 } INT NUM [ 52 ]。 DP LL [ 52である [] 52れる ] [ 52である ] [ 3。、F [] 52である ]; // 注意深いブラストINT INT TOT = 0 。 LL DFS(int型 POS、int型の CNT、int型の目標は、int型LIM) { もし(POS!)戻り CNT == 目標。 もし(〜DP [POS] [CNT] [目的] [LIM])戻りDP [POS] [CNT] [目的] [LIM]。 int型?MAXX = LIM NUM [POS]:1 ; LLのRES = 0 。 以下のための(int型私は= 0 ; I <= MAXX; ++ i)は RES + = DFS(POS- 1、CNT +(I == 1)、目標、LIM &&(I == MAXX))。 返す DP [POS] [CNT] [目的] [LIM] =の解像度を、 } LL迅速な(LL、LLのX) { LL ANS = 1 。 一方、(X) { もし(X&1)ANS = ANS *%のMOD。= A *%のMOD; X >> = 1 。 } 返す歳; } 空解く(LL用X) { 一方、(X) { NUM [ ++ TOT = Xの&1 。 X >> = 1 。 } 以下のために(int型 I = 2 ;私は= < 50 ; Iは++) - (DPのmemsetを。1、はsizeof(DP))、F [I]はDFS(TOT = 0、Iは、1); // 空覚えを毎回異なる要件1の数 LL ANS = 1 ; のための(int型 I = 2 ; Iは= < 50 ; ++ I) IF(F [I])*クイックANS ANS =(I、F [I]) %MOD; printf(" %LLDする\ n " 、ANS)。 } int型のmain() { LL N = 読み取ります()。 (n)を解きます。 }