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);
}
View Code

 

posted @ 2018-07-02 07:49  TOBICHI_ORIGAMI  阅读(113)  评论(0编辑  收藏  举报