2019分解成若干个素数之和的方案数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool vis[3005];
ll prime[3005],cnt,dp[3555][3555];
ll n=2019,ans;
int main() {
for(int i=2; i<=n; i++) {
if(!vis[i]) prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<=n;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
memset(dp,0,sizeof(dp));
for(int i=0;i<cnt;i++) dp[prime[i]][prime[i]]=1;
for(int i=2;i<=n;i++){
for(int j=0;prime[j]<=i&&j<cnt;j++){
for(int k=0;k<j&&prime[k]<=i-prime[j];k++){
dp[i][prime[j]]+=dp[i-prime[j]][prime[k]];
}
}
}
ll ans=0;
for(int i=0;i<cnt;i++) ans+=dp[n][prime[i]];
printf("%lld",ans);
}