#include #include #include #include using namespace std; #ifndef N #define N 4 #endif #define MAX_COUNT 10000 typedef struct sDataEntry{ mpz_t datas[N]; mpz_t nc; sDataEntry(){ int i; for(i=0;i=0;i--){ int c=mpz_cmp(datas[i],s.datas[i]); if(c!=0)return c<0; } return false; } bool operator==(const struct sDataEntry& s)const{ int i; for(i=N-1;i>=0;i--){ int c=mpz_cmp(datas[i],s.datas[i]); if(c!=0)return false; } return true; } }DataEntry; set results; DataEntry t; int td[N]; void search_last() { long long mul=1LL; long long sum=0LL; int i; if(td[N-3]==1)return;///No solution available for(i=0;iN)return; ub=pow((double)N/(double)mul,1.0/(N-2-last))+0.01; i=1;if(last>0)i=td[last-1]; for(;i<=(int)ub;i++){ td[last]=i; search(last+1); } } int tcount=0; void dump(const DataEntry& d) { int i; for(i=0;i0&&mpz_cmp(d.datas[i],d.datas[i-1])==0) continue; mpz_mul(tmp,d.datas[i],d.datas[i]); mpz_sub(tmp,sum,tmp); mpz_div(tmp,tmp,d.datas[i]); if(mpz_cmp(tmp,d.datas[N-1])>0){ for(j=0;j::iterator lit; lit=results.find(t); if(lit==results.end()){ results.insert(t); tcount++; } } } mpz_clear(sum);mpz_clear(tmp); return tcount::iterator it; for(it=results.begin();it!=results.end();++it){ if(!gens(*it)) break; } mpz_t maxt; mpz_init(maxt); mpz_set(maxt,it->nc); set::iterator nit; for(nit=results.begin();nit!=results.end();++nit){ if(mpz_cmp(nit->datas[N-1],maxt)<=0) dump(*nit); } mpz_clear(maxt); } int main() { int i; search(0); set::iterator it; gen_more(); }