[Codeforces113C]Double Happiness(数论)

时间:2023-03-09 16:49:13
[Codeforces113C]Double Happiness(数论)

题意

给定闭区间[l,r] [l,r] [l,r],找出区间内满足t=a2+b2 t=a^{2}+b^{2} t=a2+b2的所有素数t t t的个数( a,b a,b a,b为任意正整数).

思路

这是一个手推很容易找出规律的数学题

听说是传说中的

费马二平方定理

  1. 除2以外的所有的素数都可以分为两类:4k + 1,4k + 3
  2. 4k + 1可以表示为2个整数的平方和,但4k + 3不行

(上面来自题解)

这道题只要判断一个质数就够了吧?%4==1符合要求

因为一开始MLE了,看了一下题解,用的bitset

#include<bits/stdc++.h>
using namespace std;
bitset <> pr;
int prime[];
int cnt,l,r;
void make()
{
pr[] = pr[] = ;
for (register int i = ; i <=r; i++)
{
if (pr[i]==) prime[++cnt] = i;
for (register int j = ; j <= cnt && i*prime[j] <= r; j++)
{
pr[i*prime[j]] = ;
if (i%prime[j] == ) break;
}
}
}
int calc(int l, int r)
{
int ans = ;
for (register int i = ; i <= r; i += )
{
if (i >= l && pr[i] == ) ++ans;
}
if (l <= && r >= ) ++ans;
return ans;
}
int main()
{
scanf("%d%d", &l, &r);
make();
printf("%d\n", calc(l, r));
return ;
}