hdu 4508 美素数(线段树)

来源:互联网 发布:外商直接投资总量数据 编辑:程序博客网 时间:2024/06/08 06:14

以后解题报告都加上题目。

数据量比较大,感觉暴力的话会超时,所以用线段树处理。

逐个求出美素数,然后将美素数存入线段树中。。。。不知道该说啥了,模板级线段树。。。。。

#include<stdio.h>#include<string.h>#define N 1000005int a[N];struct node{int x,y;int count;}s[N*3];void CreatTree(int t,int x,int y){s[t].count=0;s[t].x=x;s[t].y=y;if(s[t].x==s[t].y)return ;int temp=t*2;int mid=(x+y)/2;CreatTree(temp,x,mid);CreatTree(temp+1,mid+1,y);return ;}void InsertTree(int t,int x){if(s[t].x==s[t].y&&s[t].x==x){s[t].count++;return ;}int temp=t*2;int mid=(s[t].x+s[t].y)/2;if(x>mid)InsertTree(temp+1,x);elseInsertTree(temp,x);s[t].count=s[temp].count+s[temp+1].count;return ;}int FindTree(int t,int x,int y){if(s[t].x==x&&s[t].y==y)return s[t].count;int mid=(s[t].x+s[t].y)/2;int temp=t*2;int sum=0;if(x>mid)sum+=FindTree(temp+1,x,y);else if(y<=mid)sum+=FindTree(temp,x,y);else{sum+=FindTree(temp,x,mid);sum+=FindTree(temp+1,mid+1,y);}return sum;}int fun(int x){int sum;sum=0;while(x){sum+=x%10;x/=10;}return sum;}int main(){int T;int i,j;memset(a,0,sizeof(a));a[0]=a[1]=1;CreatTree(1,1,1000000);for(i=2;i<=1000000;i++){if(a[i]==0){if(a[fun(i)]==0)InsertTree(1,i);for(j=i*2;j<=1000000;j+=i)a[j]++;}}int m,n;int count;count=1;scanf("%d",&T);while(T--){scanf("%d%d",&m,&n);printf("Case #%d: %d\n",count++,FindTree(1,m,n));}return 0;}


原创粉丝点击