話題の羅区4317フローラ番号(デジタルDP)

ポータル

涼しい日陰を楽しんで、いくつかのトピックを磨くことを望んでいた、この質問はトピックの番号に電話する権利を有するが、実際には、デジタルチャンネル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)を解きます。
} 
コードの表示

おすすめ

転載: www.cnblogs.com/yyys-/p/11295638.html