HDU 5901 Count primes(1e11以内的素数个数)
2016-09-21 16:40
288 查看
模板求1011以内的素数个数
代码:
代码:
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; #define MAX 400005 #define maxnode 10 #define sigma_size 30 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; const double pi = acos(-1.0); //const double inf = 1e18; const double eps = 1e-8; const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ const int MAXN = 105; const int MAXM = 10005; const int MAXP = 40005; //const int MAX = 400005; #define chkbit(ar, i) (((ar[(i) >> 6]) & (1 << (((i) >> 1) & 31)))) #define setbit(ar, i) (((ar[(i) >> 6]) |= (1 << (((i) >> 1) & 31)))) #define isprime(x) (( (x) && ((x)&1) && (!chkbit(ar, (x)))) || ((x) == 2)) namespace pcf{ long long dp[MAXN][MAXM]; unsigned int ar[(MAX >> 6) + 5] = {0}; int len = 0, primes[MAXP], counter[MAX]; void Sieve(){ setbit(ar, 0), setbit(ar, 1); for (int i = 3; (i * i) < MAX; i++, i++){ if (!chkbit(ar, i)){ int k = i << 1; for (int j = (i * i); j < MAX; j += k) setbit(ar, j); } } for (int i = 1; i < MAX; i++){ counter[i] = counter[i - 1]; if (isprime(i)) primes[len++] = i, counter[i]++; } } void init(){ Sieve(); for (int n = 0; n < MAXN; n++){ for (int m = 0; m < MAXM; m++){ if (!n) dp [m] = m; else dp [m] = dp[n - 1][m] - dp[n - 1][m / primes[n - 1]]; } } } long long phi(long long m, int n){ if (n == 0) return m; if (primes[n - 1] >= m) return 1; if (m < MAXM && n < MAXN) return dp [m]; return phi(m, n - 1) - phi(m / primes[n - 1], n - 1); } long long Lehmer(long long m){ if (m < MAX) return counter[m]; long long w, res = 0; 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 - 1; for (i = a; primes[i] <= s; i++) res = res - Lehmer(m / primes[i]) + Lehmer(primes[i]) - 1; return res; } } using namespace pcf; int main(){ init(); LL n; while(cin>>n){ cout<<Lehmer(n)<<endl; } return 0; }
相关文章推荐
- HDU 5901-Count primes(1e11以内素数的个数)
- HDU 5901 Count primes (求1e11内素数个数、模板题....)
- hdu 5901 Count primes(Meisell-Lehmer 统计n(很大)以内的素数个数)
- HDU 5901 Count primes (求1e11内素数个数)
- HDU 5901 Count primes (1e11内的素数个数) -2016 ICPC沈阳赛区网络赛
- HDU 5901 Count primes(求1e11内素数个数模板)
- HDU --- 5901 Count primes 【求1e11内的素数模板题】
- HDU 5901 Count primes (区间素数个数)
- Count primes 1e11以内的素数
- HDU 5901 Count primes 2016年沈阳网络赛 (Lehmer素数计数)
- HDU-5901-Count primes(大素数模板)
- [素数个数模板] HDU 5901 Count primes
- (待更新理解)(数值过大素数计数模版)HDU 5901 Count primes
- hdu-5901-Count primes(求1~n内素数个数)
- hdu 5901 Count primes (大素数模板)
- HDU 5901 Count primes (大素数模板题)
- HDU 5901 Count primes (Meisell-Lehmer算法 -- 模板)
- hdu 5901 Count primes
- hdu 5901 n以内素数计数
- hdu 5901(模板,10^11以内的素数个数)