[ゲーム] SCOI2009

タイトル

DP

 

質問の意味は、Nを構成することができる数はで見つけることができますリングの数

セットアップKリング、各ループの長さは Lである[i]は、提供LCM(L [1]、L [2]·····、L [K]) の分解である品質係数= P_ {1} ^ {C_ {1}} * P_ {2} ^ {C_ {2}} * ... * P_ {K} ^ {C_ {K}}

今、私たちは得ることができます結論をP_ {1} ^ {C_ {1}} + P_ {2} ^ {C_ {2}} + ... + P_ {K} ^ {C_ {K}} \当量のn

場合  P_ {1} ^ {C_ {1}} + P_ {2} ^ {C_ {2}} + ... + P_ {K} ^ {C_ {K}}> N 、それは違法ではありません

今までプッシュ、我々はDPに来ることができます

設定しF [i]は[J]プライムにi番目の列挙子のためのプログラムの数、およびJ、

その後、我々は方程式の転送タイプを描くことができます

 

F [I] [J] = \ sum_ {k = 1} ^ {K \の当量のJ} F [I-1]〜[J-P_ {I} ^ {K}]

これは、一次元、二次元にロールバックすることができます

コード

 

書式#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)。
}

 

  

 

  

 

おすすめ

転載: www.cnblogs.com/nibabadeboke/p/11329457.html