【动态规划】[AHOI2001]质数和分解

来源:互联网 发布:js urldecode 在线 编辑:程序博客网 时间:2024/06/05 15:58

题目

首先预处理200以内的质数 我用了埃氏筛法
然后就相当于完全背包求取方案数

fj+=fjprimei

可以这么理解 一个数要拆成若干素数和 等同于拆成所有该数减去一个素数差的方案数之和 但这么做需要初始化为0

代码如下

#include<iostream>#include<cstdio>#include<cctype>    using namespace std;    #define in = read()    typedef long long ll;    typedef unsigned int ui;    const ll size = 200 + 10;        int n;        int site;        int prime[size] , f[size];        bool exist[size];inline ll read(){        ll num = 0 , f = 1;    char ch = getchar();        while(!isdigit(ch)){                if(ch == '-')   f = -1;                ch = getchar();        }        while(isdigit(ch)){                num = num*10 + ch - '0';                ch = getchar();        }        return num*f;}inline void work(){        exist[0] = true;    exist[1] = true;        for(register int i=2;i<=200;i++)                if(!exist[i]){                        prime[++ site] = i;                        for(register int j=(i<<1);j<=200;j+=i)                                exist[j] = true;                }}int main(){        work();        f[0] = 1;        for(register int i=1;i<=site;i++)                for(register int j=prime[i];j<=200;j++)                        f[j] += f[j - prime[i]];        while(cin>>n)       printf("%d\n" , f[n]);        return 0;}//COYG
原创粉丝点击