Блог пользователя beginner_boy

Автор beginner_boy, история, 5 лет назад, По-английски

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.

  • Проголосовать: нравится
  • +38
  • Проголосовать: не нравится

»
5 лет назад, скрыть # |
 
Проголосовать: нравится +174 Проголосовать: не нравится

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

»
5 лет назад, скрыть # |
 
Проголосовать: нравится +13 Проголосовать: не нравится

There is std::lcm since C++17. You can simply use one from C++ standard library. https://en.cppreference.com/w/cpp/numeric/lcm