题目地址:POJ 3292
先利用素数筛的原理把H_prime筛出来,然后打表。要预处理,否则TLE。
代码如下:
#include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #include <stdio.h> using namespace std; #define LL __int64 #define pi acos(-1.0) const int mod=100000000; const int INF=0x3f3f3f3f; const double eqs=1e-8; int h_prime[1000000], tot, check[1000100], vis[1000002], num[1000002]; void init() { int i, j; LL x, ans=0; tot=0; memset(check,0,sizeof(check)); for(i=5;i<=1000001;i+=4){ if(!check[i]){ h_prime[tot++]=i; } for(j=0;j<tot;j++){ if(i*h_prime[j]>1000001) break; check[i*h_prime[j]]=1; if(i%h_prime[j]==0) break; } } for(i=0;i<tot;i++){ for(j=0;j<tot;j++){ x=h_prime[i]*h_prime[j]; if(x>1000001) break; if(!vis[x]){ vis[x]=1; } } } for(i=0;i<1000001;i++){ if(vis[i]) ans++; num[i]=ans; } } int main() { int n, i, pos, j; LL ans, x; init(); while(scanf("%d",&n)!=EOF&&n){ printf("%d %d\n",n,num[n]); } return 0; }
时间: 2024-10-07 00:58:42