公倍数之间的情况都是一样的,有循环节。
注意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()); } } }
时间: 2024-10-13 21:00:06