完全背包【p1832】A+B Problem(再升級)
阿新 • • 發佈:2018-10-26
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(再升級)