洛谷P2563 [AHOI2001]质数和分解

本文介绍了一种算法,用于计算一个给定的自然数n可以由多少种不同的质数之和的方式组成。该算法结合了完全背包问题的解决思路和质数筛选方法。

题目描述

任何大于 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<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define MAXN 210
using namespace std;
int n,k=0,p[MAXN],f[MAXN<<1];
bool np[MAXN];
void make(){
	int m=MAXN+10;
	memset(np,false,sizeof(np));
	for(int i=2;i<m;i++){
		if(!np[i])p[++k]=i;
		for(int j=1;j<=k&&p[j]*i<m;j++){
			np[p[j]*i]=true;
			if(i%p[j]==0)break;
		}
	}
}
void work(){
	memset(f,0,sizeof(f));
	f[0]=1;
	for(int i=1;p[i]<=MAXN;i++)
	for(int j=p[i];j<=MAXN;j++)
	f[j]+=f[j-p[i]];
}
void init(){
	printf("%d\n",f[n]);
}
int main(){
	make();
	work();
	while(~scanf("%d",&n))init();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值