1. 程式人生 > >質數和分解(完全背包)

質數和分解(完全背包)

def -m 大於等於 algo queue orange col return pre

題目描述

任何大於 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

代碼:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include
<vector> #include<cmath> const int maxn=1e5+5; typedef long long ll; using namespace std; int pri[205],cnt=0; bool vis[205]; void Oula(){ int i,j; for(i=2;i<205;i++){ if(!vis[i]){pri[++cnt]=i;} for(j=1;j<=cnt && pri[j]*i<205;j++){ vis[pri[j]
*i]=1; if(i*pri[j]==0)break; } } return; } int n; int f[205]; int main(){ Oula(); int i,j; memset(f,0,sizeof f); f[0]=1; for(i=1;i<=cnt;i++){ for(j=pri[i];j<205;++j){ f[j]+=f[j-pri[i]]; } } while(scanf("%d",&n)!=EOF){ printf("%d\n",f[n]); } return 0; }

質數和分解(完全背包)