题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2866
题意:在 [2,L]中找出 p,满足 n^3+p*n^2=m^3,问:有多少个p?
题解:
参考博客:https://blog.csdn.net/ACdreamers/article/details/8572959
推导:n^d+p*n^(d-1)=m^d,即 n^(d-1)*(n+p)=m^d。
要想得到m^d,那么我们就必须设 n=x^d, n+p=y^d,故 (x^d)^(d-1)*y^d=(x^(d-1)*y)^d,得 m=x^(d-1)*y。
p=y^d-x^d。
又因为 (y-x)|p,p又是素数,故 y-x=1,代入得 p=(x+1)^d-x^d。所以我们就枚举x,并判断p是否是素数就行了。
证明下 (y-x)|p:设t=y-x,代入得 p=(t+x)^d-x^d,显然此时p能整除t。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1000100;
bool vis[maxn];
int prime[maxn],tot;
void init()
{
memset(vis,1,sizeof(vis));
vis[1]=0,tot=0;
for(int i=2;i<maxn-10;i++){
if(vis[i]) prime[++tot]=i;
for(int j=1;j<=tot&&i*prime[j]<maxn-10;j++){
vis[i*prime[j]]=false;
if(i%prime[j]==0) break;
}
}
}
//LL fast_pow(int a,int n)
//{
// LL ans=1;
// while(n)
// {
// if(n&1) ans*=a;
// a=a*a;
// n>>=1;
// }
// return ans;
//}
int main()
{
init();
LL n;
while(~scanf("%lld",&n))
{
int ans=0;
LL p;
for(int x=1;;x++)
{
p=(1LL*(x+1)*(x+1)*(x+1)-1LL*x*x*x);
if(p>n) break;
if(vis[p]) ans++;
}
if(ans)
printf("%d\n",ans);
else puts("No Special Prime!");
}
return 0;
}