【2018/08/29】T1-线性筛素数(水题)-pmatrix(SDOJ 3727)

版权声明:虽然我只是个小蒟蒻但转载也请注明出处哦 https://blog.csdn.net/weixin_42557561/article/details/82181589

 哥德巴赫矩阵 


【问题描述】 
  根据哥德巴赫猜想(每个不小于 6 的偶数都可以表示为两个奇素数之和),定义 
哥德巴赫矩阵 A 如下:对于正整数对(i,j),若 i+j 为偶数且 i,j 均为奇素数,则Ai,j = 1, 
否则Ai,j = 0。现在有若干询问(x1,y1,x2,y2),你需要回答下列式子的值 
 
   
 
【输入】 
第一行一个整数 m 
接下来 m 行,每行四个整数 x1 y1 x2 y2,表示一个询问 
【输出】 
m 行,每行一个整数,表示对应询问的答案 
【输入样例】 

1 1 3 5 
 
【输出样例】 

 
 
30%的数据保证 x2, y2, m ≤ 100 
100%的数据保证 1 ≤ x1 ≤ x2 ≤ 106; 1 ≤ y1 ≤ y2 ≤ 106; m ≤ 1000 
 
 

分析

这就是一道水题。。。。。

线性筛素数+模拟+组合

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#define in read()
#define N 1000000
#define ll long long
using namespace std;
inline int read(){
	char ch;int f=1,res=0;
	while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
	while(ch>='0'&&ch<='9'){res=(res<<3)+(res<<1)+ch-48;ch=getchar();}
	return f==1?res:-res;
}
int m,x,y,xx,yy;
int mark[N+4],pri[N+4],num=0;
int sum[N+4];//sum[i]-->到 i 截止有多少个奇素数,前缀和 
void prime(){//线性筛素数的板子 
	mark[1]=1;
	for(int i=2;i<=N;++i){
		if(!mark[i])	pri[++num]=i;
		for(int j=1;j<=num&&pri[j]*i<=N;++j){
			mark[pri[j]*i]=1;
			if(i%pri[j]==0)	break;
		}
	}
}
int main(){
	m=in;
	int i,j,k;
	prime();
	for(i=1;i<=N;++i){
		if((!mark[i])&&(i&1)) sum[i]=sum[i-1]+1;
		else sum[i]=sum[i-1];
	}
	for(i=1;i<=m;++i){
		ll tot=0;
		x=in;y=in;xx=in;yy=in;
		if(y>yy) swap(yy,y);
		if(x>xx) swap(xx,x);
		int add=sum[yy]-sum[y-1];
		int add1=sum[xx]-sum[x-1];//组合 
		tot+=1ll*add*add1;
		printf("%lld\n",tot);
	}
	return 0;
}

自我检讨:我简直就是一个超级无敌大傻逼!!!考场上觉得唯一可以A的题,居然全WA,原因是题读错了!!!以后无论多么水的题都要检查!!!检查检查检查,审题审题审题
 

猜你喜欢

转载自blog.csdn.net/weixin_42557561/article/details/82181589