公倍数之间的情况都是一样的,有循环节。
注意min(a,b)>t的情况和最后一段的处理。C++写可能爆longlong,直接Java搞吧......
import java.io.BufferedInputStream; import java.math.BigInteger; import java.util.Scanner;public class Main {public static BigInteger GCD(BigInteger a,BigInteger b){if(b.compareTo(BigInteger.ZERO)==0) return a;return GCD(b,a.remainder(b));}public static BigInteger MIN(BigInteger a,BigInteger b){if(a.compareTo(b)>=0) return b;return a;}public static void main(String[] args) {Scanner sc = new Scanner (new BufferedInputStream(System.in));BigInteger t=sc.nextBigInteger();BigInteger a=sc.nextBigInteger();BigInteger b=sc.nextBigInteger();if(MIN(a,b).compareTo(t)>0){System.out.print("1"+"/"+"1");}else{BigInteger gcd=GCD(a,b);BigInteger lcm=a.multiply(b).divide(gcd);BigInteger k=MIN(a,b).subtract(BigInteger.ONE);BigInteger ans=BigInteger.ZERO;BigInteger tmp=t.divide(lcm);ans=k;if(tmp.compareTo(BigInteger.ZERO)>0){BigInteger u=tmp.subtract(BigInteger.ONE);ans=ans.add(u.multiply(k.add(BigInteger.ONE)));ans=ans.add(BigInteger.ONE);ans=ans.add(MIN(k,t.subtract(lcm.multiply(tmp))));}BigInteger fz=ans;BigInteger fm=t;BigInteger e=GCD(fz,fm);fz=fz.divide(e);fm=fm.divide(e);System.out.print(fz.toString()+"/"+fm.toString());}} }