完全背包【p1832】A+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]);
}

猜你喜欢

转载自www.cnblogs.com/-guz/p/9857901.html