#include <iostream>
#include <algorithm>
#include <limits.h>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N = 1e5;
typedef long long ll;
#define IOS ios::sync_with_stdio(0),cin.tie(0)
//class group{
//public:
// int AC;
// string name;
// int time;
// vector<vector<int>> info;
// group(){
// this->AC = 0;
// this->time = 0;
// this->info = vector<vector<int>> (100,vector<int>(2,-1));
// }
//};
//
//vector<group> groups;
//
//int Search(string name){
// for (int i=0;i<groups.size();i++){
// if(groups[i].name == name){
// return i;
// }
// }
// return -1;
//}
//
//bool cmp(group a,group b){
// if(a.AC!=b.AC){
// return a.AC>b.AC;
// }else{
// return a.time<b.time;
// }
//}
//
//int main(){
// IOS;
// int sub_time,judge_result;
// string sub_name;
// char problem_num;
//
// while(cin>>sub_time>>sub_name>>problem_num>>judge_result){
// int index = Search(sub_name);
// if(index==-1){
// group new_group;
// new_group.name = sub_name;
// index = groups.size();//更新index
// groups.push_back(new_group);
// }
// if(groups[index].info[problem_num-'A'][0] == 0){
// continue;
// }
// if(judge_result != 0){
// groups[index].info[problem_num-'A'][1]++;
// }else{
// groups[index].AC+=1;
// groups[index].time += sub_time+(groups[index].info[problem_num-'A'][1]+1)*20; //初始化为-1了
// }
// }
// sort(groups.begin(),groups.end(),cmp);
// for(group it:groups){
// if(it.AC!=0){
// cout<<it.name<<" "<<it.AC<<" "<<it.time<<endl;
// }
// }
//
// return 0;
//}
//int a[N],result;
//int search1(int n,int min_pos,int step){
// if(n<3){
// return min_pos;
// }
// if(n==3){
// return INT_MAX;
// }
// int deleodd = search1(n/2,min_pos+step,step*2);
// int deleeven = search1((n+1)/2,min_pos,step*2);
// return min(deleodd,deleeven);
//}
//int search2(int n){
// if( n<N && (a[n]!=0)){
// return a[n];
// }
// if(n==3) {
// return 1;
// }
// if(n<3){
// return 0;
// }
// result = search2(n/2)+search2((n+1)/2);
//
// if(n<N){
// a[n] = result;
// }
// return result;
//}
//vector<int> a;
//set<int> b;
//multiset<int> c;
//
//bool check(int a,int b){
// c.clear();
// while(a || b){
// c.insert(a%10);
// c.insert(b%10);
// a /= 10;
// b /= 10;
// }
// for(int i=1;i<=9;i++){
// if(c.count(i)>1) return false;
// }
// return true;
//}
//
//void seek(int n){
// for(int i=2;i<N;i++){
// if( i%n==0 && check(i,i/n)){
// printf("%05d/%05d=%d\n",i,i/n,n);
// }
// }
//}
//int main(){
// IOS;
// ll a,b;
// int tmp[11];
// cin>>a>>b;
// for(int i=1;i<=a;i++){
// cin>>tmp[i];
// }
// if(a==1){
// if(tmp[1]%b==0){
// cout<<tmp[1]<<endl;
// return 0;
// }else{
// cout<<-1<<endl;
// return 0;
// }
// }
// sort(tmp+1,tmp+a+1,less<int>());
// do{
// int flag=0;
// ll c=0;
// for(int i=1;i<=a;i++){
// c = c*10+tmp[i];
// }
// if(c%b==0&&c>=pow(10,a-1)){
// flag=1;
// cout<<c<<endl;
// return 0;
// }
// }while(next_permutation(tmp+1,tmp+a+1));
// cout<<-1<<endl;
// return 0;
//}
//ll H(int n){
// if(n<0) return 0;
// ll ans = 0;
// int i,j;
// for(i=1;n/i-n/(i+1)!=0;i++){
// ans += i*(n/i-n/(i+1));
// }
// for(j=1;j<=n/i;j++){
// ans += n/j;
// }
// return ans;
//}
//
//void seek(int n){
// stack<pair<int,int>> a;
// for(int i=1;i<n+sqrt(n*n-i*i);i++){
// double tmp = sqrt(n*n-i*i);
// if(tmp == int(tmp)&&i>tmp){//这里i必须要在tmp前面,因为tmp是double具有误差 ,而i比较小时,double误差小
// a.push({i,int(tmp)});
// }
// }
//
// for(int i=n+1;i<n+sqrt(i*i-n*n);i++){
// double tmp = sqrt(i*i-n*n);
// if(tmp == int(tmp)){
// a.push({i,int(tmp)});
// }
// }
//
// while(!a.empty()){
// pair<int,int> b = a.top();
// cout<<b.first<<","<<b.second<<endl;
// a.pop();
// }
//}
//int main(){
// IOS;
// int T,n;
// cin>>T;
// while(T--){
// cin>>n;
// seek(n);
// cout<<endl;
// }
// return 0;
//}
//bool udg[N],dg[N],col[N];
//int n,ans;
//
//void queen_seek(int cur){
// if(cur>n){
// ans++;
// return;
// }
// for(int i=1;i<=n;i++){
// if((!dg[i-cur+n])&&!(udg[i+cur])&&(!col[i])){
// dg[i-cur+n]=udg[i+cur]=col[i]=true;
// queen_seek(cur+1);
// dg[i-cur+n]=udg[i+cur]=col[i]=false;
// }
// }
// return;
//}
//
//int main(){
// IOS;
// int T;
// cin>>T;
// while(T--){
// ans = 0;
// cin>>n;
// queen_seek(1);
// cout<<ans<<endl;
// }
// return 0;
//}
//int h[N],lp[N],f[N][2001];
//
//int main(){
// IOS;
// int n;
// cin>>n;
// for(int i=1;i<=n;i++) cin>>h[i];
// for(int i=1;i<=n;i++) cin>>lp[i];
// for(int i=1;i<=n;i++){
// for(int j=1;j<=2000;j++){
// if(j>lp[i]){
// f[i][j] = max(f[i-1][j],f[i-1][j-lp[i]]+h[i]);
// }else{
// f[i][j] = f[i-1][j];
// }
// }
// }
// cout<<f[n][2000]+1<<endl;
// return 0;
//}
int main()
{
long long x, y, z, k;
while (cin>>k && k)
{
//式子的格式为1/k = 1/x + 1/y + 1/z
/*
因为x>=y>=z>k 所以1/x<=1/y<=1/z 又因为1/k = 1/x + 1/y + 1/z <= 3/z 所以 1/k <= 3/z 则z<=3*k
*/
for (z = k+1; z <= 3*k; z++)
{
//先判断两项是否成立,即1/k==1/y+1/z
//已知k,z,若成立,则所求中y一定为整数,1/y==1/k-1/z, 即 y=k*z/(z-k)
y=k*z/(z-k);
if((k*z)%(z-k) == 0 && y>=z)//随着z的递增,y有可能小于z,则判断如果y大于z,则输出式子1/k==1/y+1/z
printf("1/%lld=1/%lld+1/%lld\n",k,y,z);
//判断三项是否成立,即1/k=1/x+1/y+1/z
//已知1/x+1/y的和为1/k-1/z,思路跟上面类似,将1/k-1/z作为一项进行拆分,这个结果可能无法划分为1/某数的形式
int p = k*z/(z-k);
for(y=p+1; y <= 2*p+1; y++)
{
//因为1/x=1/k-1/y-1/z 所以x=k*y*z/(y*z-k*z-k*y)
//若式子成立,则x一定为整数
x=k*y*z/(y*z-k*z-k*y);
if ((k*y*z) % (y*z-k*z-k*y) == 0 && x>=y && y>=z)//如果x>=y>=z,则输出
printf("1/%lld=1/%lld+1/%lld+1/%lld\n",k,x,y,z);
}
}
printf("\n");
}
return 0;
}
包含大部分题目