1. 程式人生 > >[AHOI2001] 質數和分解

[AHOI2001] 質數和分解

題目描述

任何大於 1 的自然數 n 都可以寫成若干個大於等於 2 且小於等於 n 的質數之和表示式(包括只有一個數構成的和表示式的情況),並且可能有不止一種質數和的形式。例如,9 的質數和表示式就有四種本質不同的形式:

9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + 3 = 2 + 7 。

這裡所謂兩個本質相同的表示式是指可以通過交換其中一個表示式中參加和運算的各個數的位置而直接得到另一個表示式。

試程式設計求解自然數 n 可以寫成多少種本質不同的質數和表示式。

輸入輸出格式

輸入格式:

檔案中的每一行存放一個自然數 n(2 < n < 200) 。

輸出格式:

依次輸出每一個自然數 n 的本質不同的質數和表示式的數目。

輸入輸出樣例

輸入樣例#1:

2
200

輸出樣例#1:

1
9845164

題目允許同一個質數重複使用,與其他質數組合成規定的數。因為質數是一定的,可以看成一定的物品,所以這就是經典的模型,完全揹包求方案數問題

先用篩法篩出200以內質數,然後直接揹包dp

int m=sqrt(201),c=0;
for(int i=2;i<=m;i++) if(!vis[i])
{
    prime[++c]=i;
    for(int j=i*i;j<=n;j+=i) vis[j]=1;
}
for(int i=1;i<=c;i++)
    for(int j=prime[i];j<=200;j++)
        f[j]=f[j]+f[j-prime[i]];
while(cin>>n) printf("%d\n",f[n]);