Codechef Coders’Legacy 2018 CLSUMG Sum of Primes
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相关推荐
- CodeChef March Lunchtime 2018 div2
地址https://www.codechef.com/LTIME58B?order=desc&sortBy=successful_submissions 简单做了一下,前三题比较水,第四题应该 ...
- Sum All Primes
求小于等于给定数值的质数之和. 只有 1 和它本身两个约数的数叫质数.例如,2 是质数,因为它只能被 1 和 2 整除.1 不是质数,因为它只能被自身整除. 给定的数不一定是质数. 直接show co ...
- Codechef January Challenge 2018 - Killjee and k-th letter
题意: 给出一个的串 s,将 s 所有子串按照字典序排列好相接起来形成一个新串q次询问,每一次询问问新串中的第 k 个字符是什么,强制在线. $|s|,q \le 2*10^{5} $ 跟所有子串有关 ...
- Codechef July Challenge 2018 : Subway Ride
传送门 首先(想了很久之后)注意到一个性质:同一条边有多种颜色的话保留3种就可以了,这是因为假如最优解要求当前位置与相邻两条边都不相同,那么只要有3条边,就肯定可以满足这一点. 完事就做一个nlogn ...
- 【线段树 泰勒展开】Codechef April Challenge 2018 Chef at the Food Fair
第一次写泰勒展开:本地和CC差距好大 题目大意 大厨住的城市里办了一场美食节.一条街上开设了$N$个摊位,编号为$1∼N$.这天开始时,第$i$个摊位的食物会导致食物中毒的概率是$P_i$.在这一天中 ...
- Codechef August Challenge 2018 : Coordinate Compression
传送门 外边二分,里面拿线段树维护贪心就行了. #include<cstdio> #include<vector> #include<cstring> #inclu ...
- 近期Freecodecamp问题总结
最近没什么事,刷了freecodecamp的算法题,发现了自己基础的薄弱 1 where are thou 写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对( ...
- Parallel 并发编程实例
算法计算小于数的所有 素数和 不用Parallel # sum_primes_without_pp.py import math, sys, timedef isprime(n):"&qu ...
- FreeCodeCamp 中级算法(个人向)
freecodecamp 中级算法地址戳这里 Sum All Numbers in a Range 我们会传递给你一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 1 function ...
最新文章
- 面试两个星期来的一点体会
- php new对象 调用函数,关于JS中new调用函数的原理介绍
- wxWidgets:wxSetCursorEvent类用法
- springboot web项目_Vue、Spring Boot开发小而完整的Web前后端分离项目实战12
- 征途LINUX服务端脚本,bat脚本实例征途夜行
- 各种组件的js 获取值 / js动态赋值
- GET和POST方式提交参数给web应用
- 循环单链表 python_循环单链表报错
- ASP.NET AJAX:Ajax验证(ajax+Handler处理)
- flask html缓存,flask_cache如何缓存动态数据,如何调用缓存数据
- 【Interfacenavigation】通过《include/》重新使用布局(9)
- openstack创建的实例不能使用ssh登录
- cad填充图案乱理石_CAD教程:CAD填充图案管理技巧
- HBuilderX 插件下载失败 解决
- 程序员叫啥名字_他们的名字叫程序员
- git clone失败的一种解决办法
- 苹果Mac电脑 如何设置Outlook企业邮箱
- React 源码中的 Object.seal
- 关于列表的“切片”操作
- 年收入过10亿美元,Veeam看好云数据管理