新华林问题验证
问题描述:
\[ 对于质数p \ \ (p \neq 2,5,11) \]
\[ 必定存在\ \ p=x+y+z \]
\[ 使得\ \ x \ast y \ast z=w^3 (w \in N) \]
代码:(范围:1~10000)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <stack>
#include <set>
#include <cstring>
#include <conio.h>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
bool isprime[10005];
ll prime[5005];
ll top=1;
bool canfind(ll x)
{
ll tx=ceil((long double)pow(x,(double)1/(double)3));
// cout<<x<<" "<<tx<<endl;
if(tx*tx*tx==x)
{
cout<<tx<<"^3 \t"<<x<<" \t";
return 1;
}
return 0;
}
int main(int argc, char const *argv[])
{
freopen("write.txt","w",stdout);
memset(isprime,1,sizeof(isprime));
for(int i=2;i<10000;i++)
{
if(isprime[i])
prime[top++]=i;
for(int j=1;j<top;j++)
{
if(i*prime[j]>10000)
break;
isprime[i*prime[j]]=0;
if(i%prime[j]==0)
break;
}
}
for(int i=1;i<top;i++)
{
ll k=prime[i]/3;
bool ff=0;
for(ll a=1;a<=k;a++)
{
if(ff)
break;
for(ll b=a;b<=(k<<1);b++)
{
ll cc=prime[i]-a-b;
if(cc<0)break;
if(canfind(a*b*cc))
{
cout<<prime[i]<<" = "<<a<<"+"<<b<<"+"<<cc<<endl;
ff=1;
break;
}
}
}
// getch();
}
return 0;
}