Buenas! Estoy intentando resolver el siguiente problema:
https://codeforces.com/problemset/problem/281/B
y me tira WA en el caso 17708 35362 1558 pero no logro encontrar el error de mi código, alguien podría darme una mano?
Creo que el problema se me rompe al comparar algunas fracciones con la operación <, ya que creo que la multiplicación se me va a la miércoles. De ser ese el problema, intenté solucionarlo trabajando con unsigned long long pero no funcionó bien mi código.
#include <bits/stdc++.h>
#define pb push_back
#define FIN ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define forr(i, a, b) for(int i = (a); i < (int) (b); i++)
#define forn(i, n) forr(i, 0, n)
#define dforr(i, a, b) for(int i = (int)(b-1); i >= (a); i--)
#define dforn(i, n) dforr(i, 0, n)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
struct frac {
ll num;
ll den;
};
bool operator <(frac a, frac b){
if(a.num*b.den < b.num*a.den){
return true;
}else{
return false;
}
}
ll mcd(ll a, ll b){
if(b==0){
return a;
}else{
return mcd(b, a%b);
}
}
frac resta (frac a, frac b)
{
frac x;
x.num=a.num*b.den-a.den*b.num;
x.den=a.den*b.den;
if(x.num==0) x.den=1;
return x;
}
int main()
{ FIN;
frac a;
ll n;
cin >> a.num >> a.den >> n;
frac cadauno[n];
ll d=mcd(a.num, a.den);
a.num=a.num/d;
a.den=a.den/d;
if(a.den<=n)
{
cout << a.num << "/" <<a.den << "\n";
return 0;
}
else
{
forr(i, 1, n)
{
frac b, c;
c.den=i;
b.den=i;
ll x=0, y=a.num, med=(x+y)/2;
while(y-x>1)
{
med=(x+y)/2;
b.num=med;
if(a<b) y=med;
else x=med;
}
b.num=med;
c.num=med+1;
if(resta(a,b)< resta(c,a)) cadauno[i]=b;
else cadauno[i]=c;
}
cadauno[0].num=0, cadauno[0].den=1;
frac aux, mejor;
forn(i, n)
{
frac rest;
aux=a;
if(cadauno[i]<a) rest=resta(a, cadauno[i]);
else rest=resta(cadauno[i], a);
if (rest<aux)
{
aux=rest;
mejor=cadauno[i];
}
// cout << cadauno[i].num << "/" << cadauno[i].den << " " << rest.num << "/" << rest.den << "\n";
}
if(n==1)
{
ll q=a.num/a.den;
cout << q << "/" << 1 << "\n";
return 0;
}
d=mcd(mejor.num, mejor.den);
cout << mejor.num/d << "/" << mejor.den/d << "\n";
}
return 0;
}