[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 <300000005> pr;
int prime[20000005];
int cnt,l,r;
void make()
{
    pr[0] = pr[1] = 1;
    for (register int i = 2; i <=r; i++)
    {
        if (pr[i]==0)    prime[++cnt] = i;
        for (register int j = 1; j <= cnt && i*prime[j] <= r; j++)
        {
            pr[i*prime[j]] = 1;
            if (i%prime[j] == 0)   break;
        }
    }
}
int calc(int l, int r)
{
    int ans = 0;
    for (register int i = 5; i <= r; i += 4)
    {
        if (i >= l && pr[i] == 0)  ++ans;
    }
    if (l <= 2 && r >= 2)  ++ans;
    return ans;
}
int main()
{
    scanf("%d%d", &l, &r);
    make();
    printf("%d
", calc(l, r));
    return 0;
}
#include using namespace std; bitset <300000005> pr; int prime[20000005]; int cnt,l,r; void make() { pr[0] = pr[1] = 1; for (register int i = 2; i <=r; i++) { if (pr[i]==0) prime[++cnt] = i; for (register int j = 1; j <= cnt && i*prime[j] <= r; j++) { pr[i*prime[j]] = 1; if (i%prime[j] == 0) break; } } } int calc(int l, int r) { int ans = 0; for (register int i = 5; i <= r; i += 4) { if (i >= l && pr[i] == 0) ++ans; } if (l <= 2 && r >= 2) ++ans; return ans; } int main() { scanf("%d%d", &l, &r); make(); printf("%d ", calc(l, r)); return 0; }
题意 给定闭区间[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为任意正整数). 思路 这是一个手推很容易找出规律的数学题 听说是传说中的 费马二平方定理 除2以外的所有的素数都可以分为两类:4k + 1,4k + 3 4k + 1可以表示为2个整数的平方和,但4k + 3不行 (上面来自题解) 这道题只要判断一个质数就够了吧?%4==1符合要求 因为一开始MLE了,看了一下题解,用的bitset #include using namespace std; bitset <300000005> pr; int prime[20000005]; int cnt,l,r; void make() { pr[0] = pr[1] = 1; for (register int i = 2; i <=r; i++) { if (pr[i]==0) prime[++cnt] = i; for (register int j = 1; j <= cnt && i*prime[j] <= r; j++) { pr[i*prime[j]] = 1; if (i%prime[j] == 0) break; } } } int calc(int l, int r) { int ans = 0; for (register int i = 5; i <= r; i += 4) { if (i >= l && pr[i] == 0) ++ans; } if (l <= 2 && r >= 2) ++ans; return ans; } int main() { scanf("%d%d", &l, &r); make(); printf("%d ", calc(l, r)); return 0; }
经验分享 程序员 微信小程序 职场和发展