问题
https://vjudge.net/problem/UVA-10483
分析
枚举a,b,通过计算得到c和s,满足关系a<=b<=c,a+b+c=abc,所以
c
=
(
a
+
b
)
/
(
a
∗
b
−
1
)
c=(a+b)/(a*b-1)
c=(a+b)/(a∗b−1)
全部转化为整数来做
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=100000+5;
const double eps=1e-6;
int kase=0,a[maxn],b[maxn];
struct Equation{
int s,a,b,c;
Equation(int s,int a,int b,int c):s(s),a(a),b(b),c(c){}
bool operator < (const Equation &rhs) const {
if(s!=rhs.s) return s<rhs.s;
else if(a!=rhs.a) return a<rhs.a;
else if(b!=rhs.b) return b<rhs.b;
else return c<rhs.c;
}
};
vector<Equation> ans;
double l,u;
int low,up;
int main(void){
while(scanf("%lf%lf",&l,&u)==2){
low=l*100;
up=u*100;
ans.clear();
for(int a=1;a<25600;++a){
if(3*a>up) break;
for(int b=a;b<25600;++b){
if(a==100 && b==200){
printf("");
}
if(a*b<=10000) continue;
int t=10000*(a+b);
if(t%(a*b-10000)) continue;
int c=t/(a*b-10000);
LL s=a*b*c,s2=a+b+c;
if(s2<low || s2>up) continue;
if(c<b || s!=10000*s2) continue;
ans.push_back(Equation(s2,a,b,c));
}
}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();++i){
printf("%.2lf = %.2lf + %.2lf + %.2lf = %.2lf * %.2lf * %.2lf\n",
ans[i].s/100.0,ans[i].a/100.0,ans[i].b/100.0,ans[i].c/100.0,
ans[i].a/100.0,ans[i].b/100.0,ans[i].c/100.0);
}
}
return 0;
}