素数筛
1.(nlogn): bool not_prime[2333]=false; //把非质数都设为false,如果not_prime为false,则是质数,为true,则不是质数 not_prime[1]=true; for(int a=2;a<=n;a++) for(int b=a+a;b<=n;b+=a) not_prime[b]=true; //是a的倍数的数b全部是非质数,即not_prime[b]=true; /*b从2a开始,每次+a,直到题目给定的范围n结束 a=2的时候,b一共+n/2次 a=3的时候,b一共+n/3次 ... a=n的时候,b一共+n/n次 那么整体时间复杂度就是: n*(n/2+n/3+...+n/n) ≈n*(n/1+n/2+n/3+...+n/n) ≈nlogn 注:n/1+n/2+n/3+...+n/n为调和级数,其值约为logn,有兴趣自查*/ /*我们知道,筛4的时候,4的倍数已经在2中筛完了 筛6的时候,6的倍数已经在3中筛完了 以此类推,合数的倍数将在前面筛完了 那么我们就有如下小优化:*/ bool not_prime[2333]=false; not_prime[1]=true; for(int a=2;a<=n;a++) if(not_prime[a]==false) for(int b=a+a;b<=n;b+=a) not