nbu 2296 素数之积

来源:互联网 发布:数据清洗步骤 编辑:程序博客网 时间:2024/05/08 05:10
题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2296

题目大意:求1~m(1<=m<=10000)中有几个数可以表示成p*q的形式,且p,q均为质数(p可以等于q).

题目思路:
第一种方法:纯暴力(时间4000MS).
第二种方法:先把筛出质数,然后利用dp[i]=dp[i-1]+{所有p*q>i-1的个数},O(10000)的复杂度预处理出所有答案.

代码:

#include <stdlib.h>#include <string.h>#include <stdio.h>#include <ctype.h>#include <math.h>#include <time.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <string>#include <iostream>#include <algorithm>using namespace std;#define ll __int64//#define ll long long#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define middle l+r>>1#define INF 0x3F3F3F3F#define esp (1e-8)#define MOD 100000007#define type int//const double pi=acos(-1.0);const int M=10000 +5;type min(type x,type y){return x<y? x:y;}type max(type x,type y){return x>y? x:y;}void swap(type& x,type& y){type t=x;x=y;y=t;}int T,cas=0;int m,f[M],ans[M];void select(){memset(f,0,sizeof(f));int MM=sqrt(1.0*M),i,j,k;for(i=3;i<=MM;i+=2) if(!f[i])for(j=i;i*j<=M;j+=2)f[i*j]=1;for(i=4;i<=M;i+=2) f[i]=1;ans[1]=ans[2]=ans[3]=0;for(i=4;i<=M;i++){ans[i]=ans[i-1];for(j=2;j<=(i>>1);j++)if(!f[j]){for(k=i/j;k>=j;k--)if(!f[k]){if(j*k<=i-1) break;ans[i]++;}}}};void run(){scanf("%d",&m);printf("%d\n",ans[m]);}int main(){//freopen("1.in","r",stdin);//freopen("1.out","w",stdout);//run();select();for(scanf("%d",&T),cas=1;cas<=T;cas++) run();//while(~scanf("%d",&n) && n) run();//system("pause");return 0;}