BZOJ 5387: [Lydsy1806月赛]质数拆分
思路:
显然meet in the middle f[i] 表示两质数和为i的方案数
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 150010; bool np[N]; int pr[N], tot; int f[N], n; void init() { for(int i=2;i<=n;i++) { if(!np[i]) pr[++tot] = i; for(int j=1;j<=tot&&pr[j]*i<=n;j++) { np[pr[j]*i]=1; if(i%pr[j]==0) break; } } for(int i=1;i<=tot;i++) { if(pr[i]+pr[i]>n-1)break; f[pr[i]+pr[i]]++; for(int j=i+1;j<=tot;j++) { if(pr[i]+pr[j]>n-1)break; f[pr[i]+pr[j]]+=2; } } } int main() { scanf("%d", &n); long long ans = 0; init(); for(int i=1;i<=n;i++) { ans += (long long)f[i] * f[n-i]; } printf("%lld", ans); }