P1832 A + B問題(アップグレード)
説明フェイス質問
プログラムの合計数を見つけるために、正の整数nを考えると、素数の数に分けます。
問題の解決策
私たちは、DPが達成リュック考えることができます
DPボードリュック番組タイトル数
F [I] = F [i]が+ F [I - [J]
F [j]はj個の素数の複数で表される総数スキームを表します
ご注意ください
1.ないふるい間違っリニア:
1)not_prime [MAXN] MAXN> = N
2)のmemsetのnot_primeアレイ後、0,1初期化が素数ではありません
2. 長い長いDPを開くためのプログラム番号の配列
コード
書式#include <iostreamの> の#include <cstdioを> する#include <cstdlib> 書式#include <アルゴリズム> 書式#include <cmath> の#include < 文字列 > の#include <CStringの> の#include <キュー> 使用して名前空間はstdを、 typedefの長い長いLL。 インラインint型リード() { int型 ANS = 0 。 チャー最後=を' '、CH = GETCHAR()。 しばらく(CH < ' 0 ' || CH> 9 ')最後= CH、CH = GETCHAR()。 一方、(CH> = ' 0 ' && CH <= ' 9 ')ANS = ANS * 10 + CH- ' 0 '、CH = GETCHAR()。 もし(最後== ' - ')ANS = - ANS; 戻り値は、ANS; } INT N; int型のプライム[ 1000年 ]、not_prime [ 1050 ]、CNT = 0 ; LL F [ 5000 ]。 ボイドXXS() { memsetの(プライム、0、はsizeof (プライム))。 memset(not_prime、0、はsizeof (not_prime))。 not_prime [ 0 ] = not_prime [ 1 ] = 1 。 以下のために(INT iが= 2 ; I <= N; I ++ ){ 場合(!not_prime [I])プライム[++ CNT] = I。 用(INT J = 1 ; J <= CNT; J ++ ){ 場合(iは素数[j]を*> N)、ブレーク。 not_prime [私は =首相[J] *] 1 。 もし(I%、プライム[J] ==0)ブレーク。 } } } int型のmain() { N = (読み取り) XXS(); F [ 0 ] = 1 ; 以下のために(INT iは= 1 ; I <= CNT; I ++ ) のための(INT J =プライム[I]; J <= N; J ++ ) F [J] + = F [J = プライム[I]]。 printf(" %のLLD \ n " 、F [N])。 リターン 0 ; }