[51nod 1139]奇妙等式的解
来源:互联网 发布:网络中介服务提供商 编辑:程序博客网 时间:2024/05/01 02:18
题目描述
五个不同自然数a < b < c < d < e 满足a^2 + b^2 + c^2 + d^2 + e^2 = abcde。给出1个数N,求e <= N的全部的解。
构造
考虑构造算法。
假如a,b,c,d,e是合法解。
bcde-a,b,c,d,e也是合法解
同理有a,acde-b,c,d,e也是……
注意这里的合法解不考虑
可以证明所有解是联通的。
#include<cstdio>#include<algorithm>#include<map>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;typedef double db;typedef pair<ll,ll> pi;typedef pair<pi,pi> pii;typedef pair<pii,ll> piii;const ll lim=2e18;const int maxt=700000,maxx=40000;map<piii,bool> ha;piii zlt;struct dong{ ll a,b,c,d,e;} ans[2500];ll dl[maxt+1000][5],a[5],b[5];int i,j,k,l,m,head,tail,top;ll n,t;bool czy;bool cmp(dong a,dong b){ if (a.a<b.a||a.a==b.a&&a.b<b.b) return 1; if (a.a==b.a&&a.b==b.b&&a.c<b.c||a.a==b.a&&a.b==b.b&&a.c==b.c&&a.d<b.d) return 1; if (a.a==b.a&&a.b==b.b&&a.c==b.c&&a.d==b.d&&a.e<b.e) return 1; return 0;}piii mk(ll a,ll b,ll c,ll d,ll e){ pi l=make_pair(a,b),r=make_pair(c,d); pii m=make_pair(l,r); return make_pair(m,e);}int main(){ //freopen("data.out","w",stdout); czy=1; /*fo(i,1,200) fo(j,i,200) fo(k,j,200) fo(l,k,200) fo(t,l,200) if (i*i+j*j+k*k+l*l+t*t==i*j*k*l*t){ printf("%d %d %d %d %d\n",i,j,k,l,t); }*/ head=0;tail=1; dl[1][0]=1;dl[1][1]=1;dl[1][2]=3;dl[1][3]=3;dl[1][4]=4; zlt=mk(1,1,3,3,4); ha[zlt]=1; /*dl[2][0]=1;dl[2][1]=3;dl[2][2]=5;dl[2][3]=12;dl[2][4]=179; zlt=mk(1,3,5,12,179); ha[zlt]=1; dl[3][0]=1;dl[3][1]=3;dl[3][2]=4;dl[3][3]=35;dl[3][4]=417; zlt=mk(1,3,4,35,417); ha[zlt]=1; dl[4][0]=1;dl[4][1]=3;dl[4][2]=5;dl[4][3]=44;dl[4][4]=657; zlt=mk(1,3,5,44,657); ha[zlt]=1; dl[5][0]=1;dl[5][1]=3;dl[5][2]=9;dl[5][3]=23;dl[5][4]=620; zlt=mk(1,3,9,23,620); ha[zlt]=1; dl[6][0]=1;dl[6][1]=3;dl[6][2]=12;dl[6][3]=31;dl[6][4]=1115; zlt=mk(1,3,12,31,1115); ha[zlt]=1; dl[7][0]=1;dl[7][1]=4;dl[7][2]=9;dl[7][3]=33;dl[7][4]=1187; zlt=mk(1,4,9,33,1187); ha[zlt]=1;*/ while (head<tail){ if (tail>=maxt){ t=t; break; } if (head==1331){ t=t; } ++head; fo(i,0,4) a[i]=dl[head][i]; fo(i,0,4){ fo(j,0,4) b[j]=a[j]; t=1; czy=1; fo(j,0,4) if (j!=i){ if (t>lim/a[j]){ czy=0; break; } t*=a[j]; } if (!czy) continue; t-=a[i]; b[i]=t; sort(b,b+5); if (b[0]<=0) continue; /*if (tail>=maxx) { czy=1; fo(j,1,4) if (b[j]==b[j-1]){ czy=0; break; } if (!czy) continue; }*/ zlt=mk(b[0],b[1],b[2],b[3],b[4]); if (b[0]==9&b[1]==23&&b[2]==620&&b[3]==128337&&b[4]==1830085619){ t=t; } if (!ha[zlt]){ ha[zlt]=1; ++tail; fo(j,0,4) dl[tail][j]=b[j]; } } } fo(i,1,tail) if (dl[i][0]==1&&dl[i][1]==3&&dl[i][2]==5&&dl[i][3]==12&&dl[i][4]==179) break; //printf("%d\n",i); scanf("%lld",&n); fo(i,1,tail){ if (dl[i][4]>n) continue; if (dl[i][0]==dl[i][1]||dl[i][1]==dl[i][2]||dl[i][2]==dl[i][3]||dl[i][3]==dl[i][4]) continue; ++top; ans[top].a=dl[i][0];ans[top].b=dl[i][1]; ans[top].c=dl[i][2];ans[top].d=dl[i][3]; ans[top].e=dl[i][4]; } if (!top) printf("No Solution\n"); else{ sort(ans+1,ans+top+1,cmp); printf("%d\n",top); fo(i,1,top) printf("%lld %lld %lld %lld %lld\n",ans[i].a,ans[i].b,ans[i].c,ans[i].d,ans[i].e); }}
0 0
- [51nod 1139]奇妙等式的解
- 奇妙的等式
- [51nod 1223]分数等式的数量
- 【51NOD 1223】分数等式的数量
- [51Nod 1223] 分数等式的数量
- 51nod 1223 分数等式的数量
- 51nod 1223 分数等式的数量
- 奇妙的等式 && 精妙的证明
- 51NOD 1417 天堂里的游戏(列等式 解方程)
- 奇妙的等式 && 精妙的证明(二)
- 查找等式的解
- [51nod1223]分数等式的数量
- 51nod1223 分数等式的数量
- 奇妙的图片
- 行为学奇妙的联觉
- 奇妙的网络世界
- 奇妙的堆栈
- auto_ptr_ref的奇妙
- 【java】Java 中父类怎么调用子类的方法?
- KMP模板
- python _、__和__xx__的区别
- 编码技巧(一)命名
- linux安装JDK遇到的几个低级问题
- [51nod 1139]奇妙等式的解
- 贪心算法之单源最短路径Dijkstra
- 双网卡
- CXF 连接超时与请求超时的设置
- 228. Summary Ranges
- 利用余弦计算文本相似性
- Spring学习04--注入、依赖、方法注入详解
- Struts2框架的意义
- “结对编程” 实验心得