问题描述
根据哥德巴赫猜想(每个不小于 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 1 3 5
输出样例
2
数据规模与约定
30%的数据保证 x2, y2, m ≤ 100
100%的数据保证 1 ≤ x1 ≤ x2 ≤ 106; 1 ≤ y1 ≤ y2 ≤ 106; m ≤ 1000
题解
比赛时没有预处理前缀和,也没开long long(比赛经验太差)
#include<cstdio>
#include<cstring>
typedef long long ll;
const int N=1e6;
int prime[N+10],p=0;
bool iscomp[N+10];
void primetable()
{
for(int i=2;i<=N;i++)
{
if(!iscomp[i])prime[p++]=i;
for(int j=0;j<p&&i*prime[j]<=N;j++)
{
iscomp[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
ll sum[N+10];
void Init()
{
for(int i=1;i<=N;i++)
{
if(i==1||i==2||iscomp[i])sum[i]=sum[i-1];
else sum[i]=sum[i-1]+1;
}
}
int main()
{
//freopen("pmatrix.in","r",stdin);
//freopen("pmatrix.out","w",stdout);
int m,x1,y1,x2,y2,i,j;
ll ans;
scanf("%d",&m);
memset(iscomp,0,sizeof(iscomp));
primetable();
Init();
for(int k=1;k<=m;k++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
ans=(sum[x2]-sum[x1-1])*(sum[y2]-sum[y1-1]);
printf("%lld\n",ans);
}
return 0;
}