码迷,mamicode.com
首页 > 其他好文 > 详细

质数和分解(完全背包)

时间:2019-05-13 23:12:43      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:包括   scanf   style   algo   algorithm   表达   格式   main   有一个   

题目描述

任何大于 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;
}

 

质数和分解(完全背包)

标签:包括   scanf   style   algo   algorithm   表达   格式   main   有一个   

原文地址:https://www.cnblogs.com/Staceyacm/p/10859295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!