这个求一千亿以内的素数大约用6780ms

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
using namespace std;
__int64 *primarr, *v;
__int64 q = , p = ; void Out(__int64 a) //输出外挂
{
if(a>)
Out(a/);
putchar(a%+'');
} __int64 Scan() //输入外挂
{
__int64 res=,ch,flag=;
if((ch=getchar())=='-')
flag=;
else if(ch>=''&&ch<='')
res=ch-'';
while((ch=getchar())>=''&&ch<='')
res=res*+ch-'';
return flag?-res:res;
}
//π(n)
__int64 pi(__int64 n, __int64 primarr[], __int64 len)
{
__int64 i = , mark = ;
for (i = len - ; i > ; i--) {
if (primarr[i] < n) {
mark = ;
break;
}
}
if (mark)
return i + ;
return ;
}
//Φ(x,a)
__int64 phi(__int64 x, __int64 a, __int64 m)
{
if (a == m)
return (x / q) * p + v[x % q];
if (x < primarr[a - ])
return ;
return phi(x, a - , m) - phi(x / primarr[a - ], a - , m);
}
__int64 prime(__int64 n)
{
char *mark;
__int64 mark_len;
__int64 count = ;
__int64 i, j, m = ;
__int64 sum = , s = ;
__int64 len, len2, len3; mark_len = (n < ) ? : ((__int64 )exp(2.0 / * log(n)) + ); //筛选n^(2/3)或n内的素数
mark = (char *)malloc(sizeof(char) * mark_len);
memset(mark, , sizeof(char) * mark_len);
for (i = ; i < (__int64 )sqrt(mark_len); i++) {
if (mark[i])
continue;
for (j = i + i; j < mark_len; j += i)
mark[j] = ;
}
mark[] = mark[] = ; //统计素数数目
for (i = ; i < mark_len; i++)
if (!mark[i])
count++; //保存素数
primarr = (__int64 *)malloc(sizeof(__int64 ) * count);
j = ;
for (i = ; i < mark_len; i++)
if (!mark[i])
primarr[j++] = i; if (n < )
return pi(n, primarr, count); //n^(1/3)内的素数数目
len = pi((__int64 )exp(1.0 / * log(n)), primarr, count);
//n^(1/2)内的素数数目
len2 = pi((__int64 )sqrt(n), primarr, count);
//n^(2/3)内的素数数目
len3 = pi(mark_len - , primarr, count); //乘积个数
j = mark_len - ;
for (i = (__int64 )exp(1.0 / * log(n)); i <= (__int64 )sqrt(n); i++) {
if (!mark[i]) {
while (i * j > n) {
if (!mark[j])
s++;
j--;
}
sum += s;
}
}
free(mark);
sum = (len2 - len) * len3 - sum;
sum += (len * (len - ) - len2 * (len2 - )) / ; //欧拉函数
if (m > len)
m = len;
for (i = ; i < m; i++) {
q *= primarr[i];
p *= primarr[i] - ;
}
v = (__int64 *)malloc(sizeof(__int64 ) * q);
for (i = ; i < q; i++)
v[i] = i;
for (i = ; i < m; i++)
for (j = q - ; j >= ; j--)
v[j] -= v[j / primarr[i]]; sum = phi(n, len, m) - sum + len - ;
free(primarr);
free(v);
return sum;
} int main()
{
__int64 n;
//int h;
///clock_t start, end;
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
//std::ios::sync_with_stdio(false);
while(~scanf("%lld",&n))
{
if(n==)
{
printf("1\n");
continue;
}
//p=1;
//q=1;
//start = clock();
Out(prime(n+));
printf("\n");
//end = clock() - start;
//printf("用时%lfms\n",(double)end);
}
return ;
}

这个完全就是爆炸了

#include <bits/stdtr1c++.h>

#define MAXN 100    // pre-calc max n for phi(m, n)
#define MAXM 100010 // pre-calc max m for phi(m, n)
#define MAXP 666666 // max primes counter
#define MAX 10000010 // max prime
#define clr(ar) memset(ar, 0, sizeof(ar))
#define read() freopen("lol.txt", "r", stdin)
#define dbg(x) cout << #x << " = " << x << endl
// compressed bool flag for sieve prime. (i >> 1) because even numbers are omitted.
#define setbit(ar, i) (((ar[(i) >> 6]) |= (1 << (((i) >> 1) & 31))))
#define chkbit(ar, i) (((ar[(i) >> 6]) & (1 << (((i) >> 1) & 31))))
#define isprime(x) (( (x) && ((x)&1) && (!chkbit(ar, (x)))) || ((x) == 2)) using namespace std; namespace pcf{
long long dp[MAXN][MAXM];
unsigned int ar[(MAX >> ) + ] = {};
int len = , primes[MAXP], counter[MAX]; void Sieve(){
setbit(ar, ), setbit(ar, );
for (int i = ; (i * i) < MAX; i++, i++){
if (!chkbit(ar, i)){
int k = i << ;
for (int j = (i * i); j < MAX; j += k) setbit(ar, j);
}
} for (int i = ; i < MAX; i++){
counter[i] = counter[i - ];
if (isprime(i)) primes[len++] = i, counter[i]++;
}
} void init(){
Sieve();
for (int n = ; n < MAXN; n++){
for (int m = ; m < MAXM; m++){
if (!n) dp[n][m] = m;
else dp[n][m] = dp[n - ][m] - dp[n - ][m / primes[n - ]];
}
}
} long long phi(long long m, int n){
if (n == ) return m;
if (primes[n - ] >= m) return ;
if (m < MAXM && n < MAXN) return dp[n][m];
return phi(m, n - ) - phi(m / primes[n - ], n - );
} long long Lehmer(long long m){
if (m < MAX) return counter[m]; long long w, res = ;
int i, a, s, c, x, y;
s = sqrt(0.9 + m), y = c = cbrt(0.9 + m);
a = counter[y], res = phi(m, a) + a - ;
for (i = a; primes[i] <= s; i++) res = res - Lehmer(m / primes[i]) + Lehmer(primes[i]) - ;
return res;
}
} int main(){
pcf::init();
long long n, res; while (scanf("%lld", &n) != EOF){
printf("%lld\n", pcf::Lehmer(n));
}
return ;
}

  

爆炸快求1~n有多少素数的更多相关文章

  1. 埃氏筛法(求n以内有多少个素数)

    题目大意:给定整数n,请问n以内有多少个素数 思路:想必要判断一个数是否是素数,大家都会了,并且可以在O(根号n)的复杂度求出答案,那么求n以内的素数呢,那样求就显得有点复杂了,下面看一下这里介绍的

  2. 求1e11以内的素数

    有两种做法,一种是打表,另一种是直接求. 打表 将1e11每隔len(len=2000w)个数字统计一下该区间内素数的个数,比如cnt[1] 表示[1,len]以内有多少个素数,cnt[2]表示[le ...

  3. 斐波那契数列(递归)&求100以内的素数

    Java 5 添加了 java.util.Scanner 类,这是一个用于扫描输入文本的新的实用程序.它是以 前的 StringTokenizer 和 Matcher 类之间的某种结合.由于任何数据都 ...

  4. HDU-2204-Eddy's爱好-容斥求n以内有多少个数形如M^K

    HDU-2204-Eddy's爱好-容斥求n以内有多少个数形如M^K [Problem Description] 略 [Solution] 对于一个指数\(k\),找到一个最大的\(m\)使得\(m^ ...

  5. 求第N个素数

    埃拉托斯特尼筛法 如果求第n 个素数,有一个数学公式可以得到第n 个素数的上界:uper=n*ln(n)+n*ln(ln(n)),n>=6.如果一个数是素数那么这个数的倍数是非素数因此例如2是素 ...

  6. Python练习题 026:求100以内的素数

    [Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...

  7. Java基础知识强化04:判断101~200之间有多少素数

    1. 判断101~200之间有多少素数? package himi.hebao; /** * (1).编写函数isPrime()用来判断输入数据是否为素数 (2).遍历判断101~200之间的数据是否 ...

  8. Python3求m以内的素数、求m个数中最小的n个数

    [本文出自天外归云的博客园] 题1:求m以内的素数(m>2) def find_all_primes_in(m): def prime(num): for i in range(2, num): ...

  9. 【C语言】输入一个整数N,求N以内的素数之和

    [C语言]输入一个整数N,求N以内的素数之和 /* ========================================================================== ...

随机推荐

  1. Json操作问题总结

    大家都知道,Json是一种轻量级的数据交换格式,对JS处理数据来说是很理想滴! 熟练写过xxx.json文件和操作的小伙伴来说,我说的问题都不是什么大问题啦,可以忽略本宝宝的文章,更希望各位大佬指点一 ...

  2. POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)

    题目链接: http://poj.org/problem?id=3923 题意描述: 输入一个n*m的屏幕 该屏幕内有至少一个对话框(每个对话框都有对应的字母表示) 判断并输出该屏幕内处于最表层的对话 ...

  3. JQ重复注册问题

    开发中常常会碰到事件重复注册,简单总结一下解决方法. (1)bind注册事件 $('...').unbind().bind('...',function(){}) (2)live注册事件 $('... ...

  4. JavaScript 版数据结构与算法(一)栈

    今天,我们要讲的是数据结构与算法中的栈. 栈的简介 栈是什么?栈是一个后进先出(LIFO)的数据结构.栈有啥作用?栈可以模拟算法或生活中的一些后进先出的场景,比如: 十进制转二进制,你需要将余数倒序输 ...

  5. Ubuntu下的终端多标签切换快捷键

    ubuntu下由于常在终端下工作,也同样需要在一个终端窗口下开启多个标签方便日常开发工作(vim党,尽量避免使用鼠标) 方法一: alt+1 alt+2 alt+3 方法二: ctrl + pageU ...

  6. python 多进程间交换信息与共享信息

    多线程调用函数,获取其返回值,个人总结了三种方法: 一.Queue(进程队列) 构造方法:multiprocessing.Queue([maxsize]) Queue.Queue类即是一个队列的同步实 ...

  7. Linux内存(手动释放cache)

    项目的扩容申请了一台机器,到手之后看一下机器的指标,看到内存使用情况是这样的. 1.查看内存 free $ free -h total used free shared buffers cached ...

  8. px转vw和vh的工具(对前端同学有用)

    CSS3中有两个新尺寸单位vw和vh, 这两个单位非常适合于开发移动端自适应页面. 假如说有一个设计师做了一张1136x750px的页面,这长页面是针对iPhone6的屏幕设计的. 前端开发工程师将这 ...

  9. win10 uwp 车表盘 径向规

    车表盘就是有刻度的圆盘加上针,这个控件可以直观让用户知道当前的速度或其他 看名字不知道是什么,我就放一张图 使用很简单,在Nuget,Radial Gauge 要使用大神做的,简单,在使用我们需要在N ...

  10. nodejs项目管理之supervisor||pm2||forever

    supervisor 是开发环境用. forever 管理多个站点,每个站访问量不大,不需要监控. pm2 网站访问量比较大,需要完整的监控界面. supervisor 特点: 代码修改,实时重启 安 ...