#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=1005; struct BigInt{ static const int BASE=(int)1e9; ll num[N],len; BigInt(){ len=1; memset(num,0,sizeof(num)); } void maintain() { len=N; while(len-1>=1&&!num[len-1])len--; } BigInt& operator = (const int &tmp){ len=1,num[0]=tmp; return *this; } bool operator ==(const int &tmp)const{ if(len==1&&num[0]==tmp)return true; return false; } BigInt& operator *= (const int &tmp){ for(int i=0;i<len;i++) num[i]=num[i]*tmp; for(int i=0;i<len;i++){ if(num[i]>=BASE){ num[i+1]+=num[i]/BASE; num[i]%=BASE; } } if(num[len])len++; return *this; } BigInt& operator /= (const int &tmp){ ll rest=0; for(int i=len-1;i>=0;i--){ num[i]+=rest*BASE; rest=num[i]%tmp; num[i]/=tmp; } maintain(); return *this; } BigInt operator - (const BigInt &tmp)const{ BigInt res; res.len=len; for(int i=0;i<len;i++){ res.num[i]=num[i]-tmp.num[i]; if(res.num[i]<0){ res.num[i+1]--; res.num[i]+=BASE; } } res.maintain(); return res; } int operator % (const int &tmp)const{ BigInt t=*this; t/=tmp; t*=tmp; t=*this-t; return t.num[0]; } void Print(){ printf("%d",num[len-1]); for(int i=len-2;i>=0;i--)printf("%09d",num[i]); } }son,mom; int gcd(int a,int b){ if(b==0)return a; return gcd(b,a%b); } struct Frac{ BigInt son,mom; void Print(){ son.Print(); putchar('/'); mom.Print(); putchar('\n'); } Frac operator * (const Frac &tmp)const{ Frac res=(Frac){son,mom}; int tson=tmp.son.num[0],tmom=tmp.mom.num[0],a,b; a=gcd(tmom,res.son%tmom); b=gcd(tson,res.mom%tson); res.son*=tson,res.mom*=tmom; res.son/=a,res.son/=b; res.mom/=a,res.mom/=b; return res; } }ans[N]; int n,p[N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&p[i]); son=1,mom=p[n]; ans[n]=(Frac){son,mom}; for(int i=n-1;i>=1;i--){ son=p[i+1]-1,mom=p[i]; if(son==0||ans[i+1].son==0){ son=0,mom=1; ans[i]=(Frac){son,mom}; }else{ int g=gcd(p[i+1]-1,p[i]); son/=g,mom/=g; ans[i]=ans[i+1]*(Frac){son,mom}; } } for(int i=1;i<=n;i++)ans[i].Print(); return 0; }
|