69,373
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
#include <stdio.h>
#define MAX_N 100
#define MAX_SQ 20000
int n3Map[MAX_N+1];
int s3Map[MAX_N+1];
int sq3Map[MAX_SQ+1];
unsigned Sqrt3(unsigned n)
{
unsigned nl=0, nr=MAX_N, nm=(MAX_N>>1);
for (;nl<nr;nm=(nl+nr+1)>>1)if ((nm*nm*nm)>n)nr=nm-1;else nl=nm;
return nm;
}
void init()
{
s3Map[0] = n3Map[0] = sq3Map[0] = 0;
for (int n=1; n<=MAX_N; ++n)
{
n3Map[n] = n*n*n;
s3Map[n] = s3Map[n-1] + n3Map[n];
}
for (int n=1; n<=MAX_SQ; ++n)
{
sq3Map[n] = Sqrt3(n);
}
}
int DFS(int nCnt, int nNums, int nMax=MAX_N)
{
int n3Root = sq3Map[nCnt];
if (nMax<=0 || nCnt<=0) return -1;
if (nNums<=1)
{
if (n3Map[n3Root] == nCnt)
return 1;
}
else
{
int n=n3Root;
if (n>nMax) n = nMax;
for (; s3Map[n]>=nCnt; --n)
{
int nRe = DFS(nCnt-n3Map[n], nNums-1, n-1);
if (nRe == 1)
return 1;
}
}
return 0;
}
#include <time.h>
int main(int argc, char *argv[])
{
init();
int n=27;
int t = clock();
int nc=2025-1;
for (n=2025; n<=MAX_SQ; ++n) //忽略2025前的解
{
int nr = DFS(n,9);
if (nr!=1)
{
++nc;
printf("%d ",n); //注释掉这句可以获得更快的速度
}
}
t = clock()-t;
printf("\nTotal= %d \tTime= %d ms\n", nc, t);
return 0;
}