1. 程式人生 > >完全背包【p1832】A+B Problem(再升級)

完全背包【p1832】A+B Problem(再升級)

spa 枚舉 iostream fin break oid getchar() true +=

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]);
}

完全背包【p1832】A+B Problem(再升級)