DP
質問の意味は、Nを構成することができる数はで見つけることができますリングの数
セットアップKリング、各ループの長さは Lである[i]は、提供LCM(L [1]、L [2]·····、L [K]) の分解である品質係数、
今、私たちは得ることができます結論を:
場合 、それは違法ではありません
今までプッシュ、我々はDPに来ることができます
設定しプライムにi番目の列挙子のためのプログラムの数、およびJ、
その後、我々は方程式の転送タイプを描くことができます
これは、一次元、二次元にロールバックすることができます
コード
書式#include <cstdioを> する#include <CStringの> 名前空間stdを使用。 BOOL VIS [2000]; 長い長いTOT、N、F [1500]、B [1500]。 ()//筛N以内的素数INITを無効 { memsetの(VIS、真、はsizeof(VIS))。 TOT = 0; 以下のために(iは++; iがn = <I 2は= INT) { IF(VIS [I] == TRUE) { Bの[++ TOT = I。 以下のために(int型J =私+; jは<= N; J + = I) VIS [j]が偽=。 } } } int型のmain() { scanf関数( "%のLLD"、&N); その中に(); F [0] = 1; 以下のために(INT I = 1; I <= TOT; iは++) { (int型J = N; jについて> = 1; j--) { int型のk = 1。 一方、(K * Bは[I] <= J)[J] + = F [JB [I] * K]、K * = B F [i]は、 } } 長い長のANS = 0。 以下のために(INT i = 1; iが<= N; iは++) ANS + = fは[I]。 printf( "%LLDする\ n"、ANS + 1)。 }