[Lydsy1806月赛] 质数拆分
(mmp我已经不知道是第几次写NTT被卡了)
可以发现质数个数是 N/log(N) 级别的,1.5*10^5之内也只有 10000 多一点质数。
所以我们第一层暴力卷积,常数可以优化成 1/2。
然后第二层直接算就行了。
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=150000; int zs[N/5+5],t=0,f[N+5],n; bool v[N+5]; ll ans; inline void init(){ v[1]=1; for(int i=2;i<=n;i++){ if(!v[i]) zs[++t]=i; for(int j=1,u;j<=t&&(u=zs[j]*i)<=n;j++){ v[u]=1; if(!(i%zs[j])) break; } } zs[t+1]=1e8; for(int i=1,u;(u=zs[i]*2)<=n;i++) f[u]++; for(int i=1;i<t;i++) for(int j=i+1,u;(u=zs[i]+zs[j])<=n;j++) f[u]+=2; } inline void solve(){ for(int i=1;i<n;i++) ans+=f[i]*(ll)f[n-i]; } int main(){ scanf("%d",&n); init(); solve(); printf("%lld\n",ans); return 0; }
我爱学习,学习使我快乐