3109 - 质数和分解

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

【问题描述:】

  任何大于1的自然数N都可以写成若干个大于2且小于等于N的质数之和的表达式(包括只有一个数构成的和表达式的情况),

并且可能有不止一种质数和的形式。例如,9的质数和表达式就有四种本质不同的形式:

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

  这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式。

试编程求解自然数N可以写成多少种本质不同的质数和表达式。
【输入格式:】文件中的每一行存放一个自然数和表达式。
【输出格式:】依次输出每一个自然数N的本质不同的质数和表达式的数目。
例如:
输入:
  2
  200
输出:
  1
  9845164

题目输入

题目输出

输入/输出样例

输入格式


                        

输出格式


                        

C++解答

#include <bits/stdc++.h>
using namespace std;

const int N = 200;
int n, p[N];	//质数表 
int m;			//输入m 
int f[209];

int main() {
	for (int i = 2; i <= 200; i ++) {
		bool flag = true;
		for (int j = 2; j * j <= i; j ++) {
			if (i % j == 0) {
				flag = false;
				break;
			}
		}
		if (flag) p[++ n] = i;
	}

	while (cin >> m) {
		memset(f, 0, sizeof(f));
		f[0] = 1;
		for (int i = 1; i <= n; i ++) {
			for (int j = p[i]; j <= m; j ++) {
				f[j] += f[j - p[i]];
			}
		}
		cout << f[m] << endl;		
	}

	return 0;
}