线性筛的一道题。
线筛是能记录最小质因子的。套模板。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define MAXN 30000012 6 int prime[MAXN],v[MAXN]; 7 int m=0;//m表示现在筛出m个质数 8 void primes(int n) 9 { 10 for(int i=2;i<=n;i++) 11 { 12 if(v[i]==0)//如果v[i]为0,说明 i 之前没有被筛到过,i 为质数 13 { 14 v[i] = i; 15 prime[++m] = i; 16 } 17 for(int j = 1;j<=m;j++)//遍历小于 i 的所有质数 18 { 19 //如果质数大于 i 的最小质因数或者乘起来大于n就跳出循环 20 if(prime[j] > v[i] || prime[j] > n/i) break; 21 v[i*prime[j]] = prime[j];//标记 i*prime[j] 的最小质因数是prime[j] 22 } 23 } 24 } 25 signed main(){ 26 int n;cin>>n; 27 primes(n); 28 29 int sum=0; 30 for(int i=2;i<=n;i++){ 31 sum+=v[i]; 32 } 33 cout<<sum<<endl; 34 return 0; 35 }
模拟一下:【其中含有给4个点坐标,判断是不是正方形模板】
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 struct str{ 5 int x,y; 6 }; 7 bool cmp(str a,str b){ 8 if(a.x!=b.x){ 9 return a.x<b.x; 10 }else{ 11 return a.y<b.y; 12 } 13 } 14 int len(int a,int b,int c,int d) 15 { 16 return (a-c)*(a-c)+(b-d)*(b-d); 17 } 18 int check(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4){ 19 int s1,s2,s3,s4,s5,s6; 20 struct str p[10]; 21 p[0].x=x1,p[0].y=y1; 22 p[1].x=x2,p[1].y=y2; 23 p[2].x=x3,p[2].y=y3; 24 p[3].x=x4,p[3].y=y4; 25 sort(p,p+4,cmp); 26 s1=len(p[0].x,p[0].y,p[3].x,p[3].y); 27 s2=len(p[1].x,p[1].y,p[2].x,p[2].y); 28 if(s1!=s2||s1==0) 29 { 30 return 0; 31 32 } 33 else if(s1==s2) 34 { 35 if(((p[0].x-p[3].x)*(p[1].x-p[2].x)+(p[1].y-p[2].y)*(p[0].y-p[3].y))==0)//对角线相等 36 return 1; 37 else return 0; 38 } 39 } 40 int main(){ 41 int x1,x2,x3,x4,y1,y2,y3,y4; 42 cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4; 43 if(check(x1,y1,x2,y2,x3,y3,x4,y4)){ 44 cout<<"wen"; 45 return 0; 46 } 47 int flag=0; 48 if(check(x1+1,y1,x2,y2,x3,y3,x4,y4)){ 49 flag=-1; 50 }else if(check(x1-1,y1,x2,y2,x3,y3,x4,y4)){ 51 flag=-1; 52 }else if(check(x1,y1+1,x2,y2,x3,y3,x4,y4)){ 53 flag=-1; 54 }else if(check(x1,y1-1,x2,y2,x3,y3,x4,y4)){ 55 flag=-1; 56 }else if(check(x1,y1,x2+1,y2,x3,y3,x4,y4)){ 57 flag=-1; 58 }else if(check(x1,y1,x2-1,y2,x3,y3,x4,y4)) { 59 flag=-1; 60 }else if(check(x1,y1,x2,y2+1,x3,y3,x4,y4)){ 61 flag=-1; 62 }else if(check(x1,y1,x2,y2-1,x3,y3,x4,y4)){ 63 flag=-1; 64 }else if(check(x1,y1,x2,y2,x3+1,y3,x4,y4)){ 65 flag=-1; 66 }else if(check(x1,y1,x2,y2,x3-1,y3,x4,y4)) { 67 flag=-1; 68 }else if(check(x1,y1,x2,y2,x3,y3+1,x4,y4)){ 69 flag=-1; 70 }else if(check(x1,y1,x2,y2,x3,y3-1,x4,y4)){ 71 flag=-1; 72 }else if(check(x1,y1,x2,y2,x3,y3,x4+1,y4)){ 73 flag=-1; 74 }else if(check(x1,y1,x2,y2,x3,y3,x4-1,y4)) { 75 flag=-1; 76 }else if(check(x1,y1,x2,y2,x3,y3,x4,y4+1)){ 77 flag=-1; 78 }else if(check(x1,y1,x2,y2,x3,y3,x4,y4-1)){ 79 flag=-1; 80 } 81 if(flag==-1){ 82 cout<<"hai xing"<<endl; 83 }else{ 84 cout<<"wo jue de bu xing"<<endl; 85 } 86 87 return 0; 88 }
树状数组维护一下然后二分答案。【树状数组模板·】
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define N 300000 5 #define int long long 6 #define inf 0x3f3f3f3f 7 struct str{ 8 int c[N]; 9 int lowbit(int x){ 10 return x&(-x); 11 } 12 void update(int x,int v){ 13 for(int i=x;i<=N;i+=lowbit(i)) 14 c[i]+=v; 15 } 16 int getsum(int x){ 17 int res=0; 18 for(int i=x;i;i-=lowbit(i)) 19 res+=c[i]; 20 return res; 21 } 22 int query(int l,int r){ 23 return getsum(r)-getsum(l-1); 24 } 25 }st; 26 signed main(){ 27 int _;cin>>_; 28 while(_--){ 29 int op=0; 30 int x,y,z; 31 cin>>op; 32 if(op==1){ 33 cin>>x>>y>>z; 34 int temp=(int)ceil(sqrt(x*x+y*y+z*z)); 35 st.update(temp,1); 36 }else{ 37 int k; 38 cin>>k; 39 int l=0; 40 int r=N; 41 int ans=inf; 42 while(l<=r){ 43 int mid=(l+r)/2; 44 if(st.getsum(mid)>=k){ 45 ans=min(ans,mid); 46 r=mid-1; 47 }else{ 48 l=mid+1; 49 } 50 } 51 if(ans==inf){ 52 printf("-1 "); 53 }else{ 54 printf("%lld ",ans); 55 } 56 } 57 58 } 59 return 0; 60 }
B题待补。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。