Description

  • 设 f(x)f(x) 表示把 xx 拆分成两个质数之和的方案数。

  • 例如 f(10)=2f(10)=2 , 因为 10=3+7=5+510=3+7=5+5

  • TT 次询问,每次给出 nn,问有多少对 (a,b)(a,b) 满足 0≤a≤b<n0≤a≤b<n 且 f(a)+f(b)=f(n)f(a)+f(b)=f(n) 。

  • 数据范围:1≤T≤5,0≤n≤1,000,0001\le T≤5,0≤n≤1,000,000 。

Sample Input:

3
1
5
10

Sample Output:

1
4
21

Solution

  • 我们把质数看做 1 ,非质数看成 0 。

  • 即设一个数组 h[i]h[i] ,若 ii 为质数则 h[i]=1h[i]=1 ,否则 h[i]=0h[i]=0 。

  • 而 n≤106n\le10^6 ,我们可以直接 O(n)O(n) 筛出 h[i]h[i] 。

  • 观察 f[i]f[i] 的定义和数论卷积的定义,我们可以愉快地发现 ff 就是两个 hh 卷起来!

  • 之后再去一下重就能预处理出 ff 了!用 FFT 快速算 f[i]f[i] 可以做到 O(n log n)O(n\ log\ n) 。

  • 接下来就可以轻松地处理询问了。

  • 用一个桶直接 O(n)O(n) 扫一遍就可以啦!

  • 倒着枚举 ii ,则答案加上 t[f[n]−f[i]]t[f[n]-f[i]] ,之后 t[f[i]]++t[f[i]]++ 。

  • 总时间复杂度 O(n log n)O(n\ log\ n) 。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=1e6+5;
const double Pi=acos(-1.0);
struct comp
{double r,i;comp(){}comp(double rr,double ii){r=rr,i=ii;}comp operator +(const comp &x)const{return comp(r+x.r,i+x.i);}comp operator -(const comp &x)const{return comp(r-x.r,i-x.i);}comp operator *(const comp &x)const{return comp(r*x.r-i*x.i,i*x.r+r*x.i);}
}f1[N<<2],f2[N<<2];
int T,n,m;
int f[N],g[N],h[N],rev[N<<2],tt[N];
bool bz[N];
inline void FFT(comp *y,int ff)
{for(int i=0;i<m;i++)if(i<rev[i]) swap(y[i],y[rev[i]]);for(int h=2;h<=m;h<<=1){comp wn(cos(2*Pi/h),ff*sin(2*Pi/h));for(int i=0;i<m;i+=h){comp w(1,0);for(int k=i;k<i+h/2;k++){comp u=y[k],t=w*y[k+h/2];y[k]=u+t;y[k+h/2]=u-t;w=w*wn;}}}if(ff==-1) for(int i=0;i<m;i++) y[i].r/=m;
}
int main()
{for(int i=2;i<N;i++){if(!bz[i]) g[++g[0]]=i;for(int j=1;j<=g[0] && i*g[j]<N;j++){bz[i*g[j]]=true;if(i%g[j]==0) break;}}for(int i=2;i<N;i++) h[i]=!bz[i];int l=0;for(m=1;m<N+N;m<<=1) l++;for(int i=0;i<m;i++) rev[i]=rev[i>>1]>>1|(i&1)<<l-1;for(int i=0;i<N;i++) f1[i]=f2[i]=comp(h[i],0);FFT(f1,1),FFT(f2,1);for(int i=0;i<m;i++) f1[i]=f1[i]*f2[i];FFT(f1,-1);for(int i=1;i<N;i++) f[i]=(int)(f1[i].r+0.5);for(int i=1;i<N;i++)if(i&1) f[i]>>=1; else f[i]=(f[i]+h[i>>1])>>1;scanf("%d",&T);while(T--){scanf("%d",&n);memset(tt,0,sizeof(tt));LL ans=0;for(int i=n-1;i>=0;i--){tt[f[n]-f[i]]++;ans+=tt[f[i]];}printf("%lld\n",ans);}return 0;
}

Codechef Coders’Legacy 2018 CLSUMG Sum of Primes相关推荐

  1. CodeChef March Lunchtime 2018 div2

    地址https://www.codechef.com/LTIME58B?order=desc&sortBy=successful_submissions 简单做了一下,前三题比较水,第四题应该 ...

  2. Sum All Primes

    求小于等于给定数值的质数之和. 只有 1 和它本身两个约数的数叫质数.例如,2 是质数,因为它只能被 1 和 2 整除.1 不是质数,因为它只能被自身整除. 给定的数不一定是质数. 直接show co ...

  3. Codechef January Challenge 2018 - Killjee and k-th letter

    题意: 给出一个的串 s,将 s 所有子串按照字典序排列好相接起来形成一个新串q次询问,每一次询问问新串中的第 k 个字符是什么,强制在线. $|s|,q \le 2*10^{5} $ 跟所有子串有关 ...

  4. Codechef July Challenge 2018 : Subway Ride

    传送门 首先(想了很久之后)注意到一个性质:同一条边有多种颜色的话保留3种就可以了,这是因为假如最优解要求当前位置与相邻两条边都不相同,那么只要有3条边,就肯定可以满足这一点. 完事就做一个nlogn ...

  5. 【线段树 泰勒展开】Codechef April Challenge 2018 Chef at the Food Fair

    第一次写泰勒展开:本地和CC差距好大 题目大意 大厨住的城市里办了一场美食节.一条街上开设了$N$个摊位,编号为$1∼N$.这天开始时,第$i$个摊位的食物会导致食物中毒的概率是$P_i$.在这一天中 ...

  6. Codechef August Challenge 2018 : Coordinate Compression

    传送门 外边二分,里面拿线段树维护贪心就行了. #include<cstdio> #include<vector> #include<cstring> #inclu ...

  7. 近期Freecodecamp问题总结

    最近没什么事,刷了freecodecamp的算法题,发现了自己基础的薄弱 1 where are thou 写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对( ...

  8. Parallel 并发编程实例

    算法计算小于数的所有  素数和 不用Parallel # sum_primes_without_pp.py import math, sys, timedef isprime(n):"&qu ...

  9. FreeCodeCamp 中级算法(个人向)

    freecodecamp 中级算法地址戳这里 Sum All Numbers in a Range 我们会传递给你一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 1 function ...

最新文章

  1. 面试两个星期来的一点体会
  2. php new对象 调用函数,关于JS中new调用函数的原理介绍
  3. wxWidgets:wxSetCursorEvent类用法
  4. springboot web项目_Vue、Spring Boot开发小而完整的Web前后端分离项目实战12
  5. 征途LINUX服务端脚本,bat脚本实例征途夜行
  6. 各种组件的js 获取值 / js动态赋值
  7. GET和POST方式提交参数给web应用
  8. 循环单链表 python_循环单链表报错
  9. ASP.NET AJAX:Ajax验证(ajax+Handler处理)
  10. flask html缓存,flask_cache如何缓存动态数据,如何调用缓存数据
  11. 【Interfacenavigation】通过《include/》重新使用布局(9)
  12. openstack创建的实例不能使用ssh登录
  13. cad填充图案乱理石_CAD教程:CAD填充图案管理技巧
  14. HBuilderX 插件下载失败 解决
  15. 程序员叫啥名字_他们的名字叫程序员
  16. git clone失败的一种解决办法
  17. 苹果Mac电脑 如何设置Outlook企业邮箱
  18. React 源码中的 Object.seal
  19. 关于列表的“切片”操作
  20. 年收入过10亿美元,Veeam看好云数据管理

热门文章

  1. MATLAB中的wavedec、wrcoef函数简析
  2. kepler架构GPU新特性--HyperQ
  3. 使用 xCAT 简化 AIX 集群的部署和管理
  4. 数据集制作_轻松学Pytorch自定义数据集制作与使用
  5. 【Python】保留小数点后两位精度
  6. [云炬创业基础笔记]第九章企业的法律形态测试4
  7. 科大星云诗社动态20210901
  8. mysql replace into 使用过程中报错
  9. 谁有正版的matlab,matlab正版
  10. VTK修炼之道60:体绘制_体绘制管线图形渲染管线