题意
给定 \(L\),求所有不超过 \(L\) 且满足 \(\exist n,m > 0,n^3+pn^2=m^3\) 的质数的个数
sol
因式分解,可得 \(n^2(n+p) = m^3\)。
设 \(n^2\) 和 \(n+p\) 都含有质因子 \(p\),则设 \(n = kp\),那么 \(n+p = (k+1)p\)
则有 \(k^2(k+1)p^3=m^3\),可得 \(k^2(k+1)\) 一定为立方数,由于 \(k^2\) 和 \(k+1\) 互质,所以 \(k^2\) 和 \(k+1\) 均为立方数,由于 \(k^2\) 是一个平方数,所以 \(k\) 为立方数,那么 \(k+1\) 不可能为立方数,矛盾,因此 \(n^2\) 和 \(n+p\) 不可能都含有质因子
设两者都含有质因子 \(q\),则 \(n\) 含有质因子 \(q\),那么 \(p\) 含有质因子 \(q\),由于 \(p\) 是质数,所以不可能存在其他质因子,矛盾,因此 \(n^2\) 和 \(n + p\) 互质。
由于 \(m^3\) 是一个立方数,因此 \(n^2\) 和 \(n + p\) 都为立方数,因为 \(n^2\) 是平方数,那么 \(n\) 也为立方数,设 \(n=x^3,n+p=y^3\),那么 \(p=y^3 - x^3 =(y-x)(y^2+xy+x^2)\),由于 \(p\) 是质数,那么 \((y-x)\) 和 \((y^2+xy+x^2)\) 中,有一个值为 \(1\),一个值为 \(p\),若 \(y^2+xy+x^2 = 0\),则 \(x=0,y=1\) 或 \(x=1,y=0\),而 \(x>0,y>0\),所以 \(y-x=1\),则 \(y=x+1\)。代入可得 \(p=(x+1)^2+x(x+1)+x^2=3x^2+3x+1\),考虑到这个值可能不为质数,因此还要判断质数。
代码
#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;
typedef long long LL;int L;LL f(int z){return (LL) 3 * z * z + 3 * z + 1;
}bool is_prime(int x){if (x == 1) return false;for (int i = 2; i <= x / i; i ++ )if (x % i == 0) return false;return true;
}int main(){scanf("%d", &L);int ans = 0;for (int z = 1; ; z ++ ){if (f(z) > L) break;ans += is_prime(f(z));}printf("%d\n", ans);
}