完全背包p1832A+B Problem(再升级)

Posted -guz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完全背包p1832A+B Problem(再升级)相关的知识,希望对你有一定的参考价值。

Description

给定一个正整数n,求将其分解成若干个素数之和的方案总数。

Input

一行:一个正整数n

Output

一行:一个整数表示方案总数

素数之和 ? 背包啊.

没一遍切的题都不是水题

我们用线性筛,筛出(leq n)的质数.

枚举每个质数.再枚举到(n),累计方案数即可.

(f[i])代表组成(i)的方案数.

注意(f[0]=1)(不需要数填充也是一种方案)

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#define int long long
#define R register
using namespace std;
inline void in(int &x)
{
    int f=1;x=0;char s=getchar();
    while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
    while(isdigit(s)){x=x*10+s-'0';s=getchar();}
    x*=f;
}
int prime[498],tot,n,f[1008];
bool vis[1008];
inline void pri()
{
    for(R int i=2;i<=n;i++)
    {
        if(!vis[i])prime[++tot]=i;
        for(R int j=1;j<=tot&& i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=true;
            if(i%prime[j]==0)break;
        }
    }
}
signed main()
{
    in(n);
    pri();f[0]=1;
    for(R int i=1;i<=tot;i++)
        for(R int j=prime[i];j<=n;j++)
            f[j]+=f[j-prime[i]];
    printf("%lld",f[n]);
}

以上是关于完全背包p1832A+B Problem(再升级)的主要内容,如果未能解决你的问题,请参考以下文章

A+B Problem(再升级)

洛谷——P1832 A+B Problem(再升级)

P1832 A+B Problem(再升级)

洛谷——P1832 A+B Problem(再升级)

P1832 A+B Problem(再升级)

洛谷 P1832 A+B Problem(再升级)