#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define FOR(i,a,b) for (int i = (a); i < (b); i++)
using namespace std;
using namespace __gnu_pbds;
using ll=long long;
using ld=long double;
using vi=vector<int>;
template<class T> using oset =tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update> ;
//上
const int N = 50001;
int wh[N];
ll inv[5217][5217];
int euclid(int a, int b, ll &x, int &y) {
if (!b) return x = 1, y = 0, a;
int d = euclid(b, a % b, y, x);
return y -= a/b * x, d;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
memset(wh,-1,sizeof(wh));
vector<int> prime(N+1,1);
for(int i = 2; i <= N; i++){
if(prime[i] == 1) for(int j = i; j <=N;j+=i) prime[j] = i;
}
vector<pair<int,int>> pot;
for(int i = 2; i <= N;i++){
unordered_map<int,int> fac;
int x = i;
int r = 1;
while( x > 1){
fac[prime[x]]++;
r *= prime[x];
x /= prime[x];
if(fac.size() > 1) break;
}
if(fac.size() == 1){
for(auto &u: fac) pot.push_back({u.first,r});
}
}
for(int i = 0; i < 5217;i++) wh[pot[i].second] = i;
int y;
for(int i = 0; i < 5217;i++){
for(int j = 0; j < 5217;j++){
if(pot[i].first == pot[j].first) continue;
euclid(pot[j].second,pot[i].second,inv[i][j],y);
if(inv[i][j] <0) inv[i][j] += pot[i].second;
}
}
int t;
cin >>t;
while(t--){
int n;
cin >> n;
if(n == 1){
cout <<"1/1\n";
continue;
}else if(n == 2){
cout <<"1/2\n";
continue;
}
unordered_map<int,int> mp;
for(int i = 1; i <= n; i++){
if(wh[i] != -1){
mp[pot[wh[i]].first] = wh[i];
}
}
double ans = 0.0;
int co = 0;
for(auto &u: mp){
ll a = 1;
for(auto &e:mp){
if(u.first == e.first) continue;
a =a*inv[u.second][e.second];
if(a > 1e13) a%= pot[u.second].second;
}
a%= pot[u.second].second;
if(co > 0)cout<<'+';
cout<<a<<"/"<<pot[u.second].second;
co++;
ans += (double)a/(double)pot[u.second].second;
}
ans += 0.5;
cout<<"-"<<floor(ans)<<"/1\n";
}
}