先瞎几把看样例想到一个公式, 然后yzl也说可以, 就去写了; 发现需要大整数, 但是讲道理之前并没有写过, 于是抄错了板子, 还没找到; 最后发现就是多了一个0, 去掉后交上去居然也过了; 后面再拿大整数板子写A题的时候,袁教练才来找我的板子的错误, ; 发现我k=(len-i-1)%4 写成了 k=(len-i-1)/4+1; 这才发现原来大整数的结构体都写错了, 居然给水过去了; 概率公式也被yzl强行说服了...
当然这道题的大数其实并不需要写那么多的...
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
typedef long long ll;
int gcd(int a, int b){
if(b == 0) return a;
return gcd(b, a % b);
}
const int ten[4] = {1, 10, 100, 1000};
const int maxl = 1000;
struct BigNumber{
int d[maxl];
BigNumber(string s){
int len = s.size();
d[0] = (len-1)/4+1;
int i, j, k;
for(i=1;i<maxl;i++) d[i] = 0;
for(i=len-1;i>=0;i--){
j=(len-i-1)/4+1;
k=(len-i-1)%4;
d[j]+=ten[k]*(s[i]-'0');
}
while(d[0]>1 && d[d[0]]==0) d[0]--;
}
BigNumber(){
*this = BigNumber(string("0"));
}
string toString(){
string s("");
int i, j, temp;
for(i=3;i>=1;--i) if(d[d[0]]>=ten[i]) break;
temp = d[d[0]];
for(j=i;j>=0;--j){
s=s+(char)(temp/ten[j]+'0');
temp%=ten[j];
}
for(i=d[0]-1;i>0;--i){
temp = d[i];
for(j=3;j>=0;--j){
s=s+(char)(temp/ten[j]+'0');
temp%=ten[j];
}
}
return s;
}
}zero("0"), d, temp, mid1[15];
BigNumber operator *(const BigNumber &a, const int &k){
BigNumber c;
c.d[0] = a.d[0];
int i, x= 0;
for(int i=1;i<=a.d[0];i++){
x=a.d[i]*k+x;
c.d[i]=x%10000;
x/=10000;
}
while(x>0){
c.d[++c.d[0]] = x%10000;
x/=10000;
}
while((c.d[0]>1) && (c.d[c.d[0]] == 0)) c.d[0]--;
return c;
}
int main(){
int t;
int m, n, nn;
scanf("%d", &t);
while(t--){
scanf("%d%d", &m, &n);
nn = n;
BigNumber ans = string("1");
while(nn-- > 1){
int dd = gcd(m, n);
n /= dd;
ans = ans * (m / dd);
}
string ss = ans.toString();
cout<<n<<"/"<<ss<<endl;
}
return 0;
}