Hello everyone, i want to present a very strange situation that happened with me on problem 1500B. I've tried to solve it by almost 3 hours, and cant figure out why my code was failing on test 11, and so i discovered that for some reason the problem was here:
ll lcm(ll n, ll m){
return n * (m / __gcd(n, m));
}
...
int n, m;
ll k;
scanf("%d %d %lld", &n, &m, &k);
ll l = lcm(n, m);
the variable l (lcm value) was given overflow (negative value), but if i change the variable n and m to ll (int64) it works as expected and i got acc. Is it right ? i mean, if i declare n and m as int32, but inside lcm i expect values as int64, this should be converted, and the return should not overflow as well, right ?
Here is my WA submission 111601427, and the accepted 111601468
Can anyone tell me why this is happening ? Thanks in advance.
There is an inbuilt function for lcm with int 32. The function you defined has int 64 arguments. But you call the lcm function with int 32 arguments. So it's identified as a call to the inbuilt lcm with int32 arrguments
Now it makes sense, thanks!
It is very simple to fix this error without changing the type of $$$n$$$ and $$$m$$$ to
long long
; just remove theusing namespace std;
statement, and addstd::
explicit prefix topair<ll,ll>
and__gcd
. 111637673There is std::lcm since C++17. You can simply use one from C++ standard library. https://en.cppreference.com/w/cpp/numeric/lcm
I need to update my local enviroment, seens that c++11 is getting old :(