#include <stdio.h>
long long average(long long a, long long b, long long c)
{
long long rem_sum = a % 3 + b % 3 + c % 3;
long long x = a / 3 + b / 3 + c / 3 + rem_sum / 3;
long long y = rem_sum % 3;
int coef1 = -(x > 0 && y < 0);
int coef2 = +(x < 0 && y > 0);
return x + coef1 + coef2;
}
int main(void)
{
long long min = -9223372036854775807 - 1;
long long max = 9223372036854775807;
printf("%d", average
(min
, min
, min
) == min
); printf("%d", average
(max
, max
, max
) == max
); printf("%d", average
(min
, min
+1, min
+2) == min
+1 ); printf("%d", average
(max
, max
-1, max
-2) == max
-1 ); printf("%d", average
(max
, 1, 2) == max
/3 + 1 ); printf("%d", average
(max
, -1, -2) == max
/3 - 1 ); printf("%d", average
(min
, 1, 2) == -(max
/3 - 1) ); printf("%d", average
(min
, -1, -2) == -(max
/3 + 1) ); printf("%d", average
(0, 0, 0) == 0 ); printf("%d", average
(2, 2, 2) == 2 );
printf("%d", average
(9223372036854775800, 4611686018427387897, 3) == 4611686018427387900); printf("%d", average
(9223372036854775800, -6, -2) == 3074457345618258597);
long long counter = 0;
long long first = -32;
long long last = 32;
for (long long a = first; a <= last; ++a)
for (long long b = first; b <= last; ++b)
for (long long c = first; c <= last; ++c)
{
long long res = (a + b + c) / 3;
if (average(a, b, c) != res)
++counter;
}
printf("Errors: %lld\n", counter
); }
I2luY2x1ZGUgPHN0ZGlvLmg+Cgpsb25nIGxvbmcgYXZlcmFnZShsb25nIGxvbmcgYSwgbG9uZyBsb25nIGIsIGxvbmcgbG9uZyBjKQp7Cglsb25nIGxvbmcgcmVtX3N1bSA9IGEgJSAzICsgYiAlIDMgKyBjICUgMzsKCWxvbmcgbG9uZyB4ID0gYSAvIDMgKyBiIC8gMyArIGMgLyAzICsgcmVtX3N1bSAvIDM7Cglsb25nIGxvbmcgeSA9IHJlbV9zdW0gJSAzOwoKCWludCBjb2VmMSA9IC0oeCA+IDAgJiYgeSA8IDApOwoJaW50IGNvZWYyID0gKyh4IDwgMCAmJiB5ID4gMCk7CgoJcmV0dXJuIHggKyBjb2VmMSArIGNvZWYyOwp9CgppbnQgbWFpbih2b2lkKQp7Cglsb25nIGxvbmcgbWluID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcgLSAxOwoJbG9uZyBsb25nIG1heCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7CgoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UobWluLCBtaW4sICAgbWluKSAgID09ICBtaW4gICAgICAgICApOwoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UobWF4LCBtYXgsICAgbWF4KSAgID09ICBtYXggICAgICAgICApOwoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UobWluLCBtaW4rMSwgbWluKzIpID09ICBtaW4rMSAgICAgICApOwoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UobWF4LCBtYXgtMSwgbWF4LTIpID09ICBtYXgtMSAgICAgICApOwoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UobWF4LCAgMSwgICAgIDIpICAgID09ICBtYXgvMyArIDEgICApOwoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UobWF4LCAtMSwgICAgLTIpICAgID09ICBtYXgvMyAtIDEgICApOwoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UobWluLCAgMSwgICAgIDIpICAgID09IC0obWF4LzMgLSAxKSApOwoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UobWluLCAtMSwgICAgLTIpICAgID09IC0obWF4LzMgKyAxKSApOwoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UoMCwgICAgMCwgICAgIDApICAgID09ICAwICAgICAgICAgICApOwoJcHJpbnRmKCIlZCIsIGF2ZXJhZ2UoMiwgICAgMiwgICAgIDIpICAgID09ICAyICAgICAgICAgICApOwoJcHJpbnRmKCJcbiIpOwoJCglwcmludGYoIiVkIiwgYXZlcmFnZSg5MjIzMzcyMDM2ODU0Nzc1ODAwLCA0NjExNjg2MDE4NDI3Mzg3ODk3LCAzKSA9PSA0NjExNjg2MDE4NDI3Mzg3OTAwKTsKCXByaW50ZigiJWQiLCBhdmVyYWdlKDkyMjMzNzIwMzY4NTQ3NzU4MDAsIC02LCAtMikgPT0gMzA3NDQ1NzM0NTYxODI1ODU5Nyk7CglwcmludGYoIlxuIik7CgoJbG9uZyBsb25nIGNvdW50ZXIgPSAwOwoJbG9uZyBsb25nIGZpcnN0ID0gLTMyOwoJbG9uZyBsb25nIGxhc3QgPSAgIDMyOwoJZm9yIChsb25nIGxvbmcgYSA9IGZpcnN0OyBhIDw9IGxhc3Q7ICsrYSkKCQlmb3IgKGxvbmcgbG9uZyBiID0gZmlyc3Q7IGIgPD0gbGFzdDsgKytiKQoJCQlmb3IgKGxvbmcgbG9uZyBjID0gZmlyc3Q7IGMgPD0gbGFzdDsgKytjKQoJCQl7CgkJCQlsb25nIGxvbmcgcmVzID0gKGEgKyBiICsgYykgLyAzOwoJCQkJaWYgKGF2ZXJhZ2UoYSwgYiwgYykgIT0gcmVzKQoJCQkJCSsrY291bnRlcjsKCQkJfQoJcHJpbnRmKCJFcnJvcnM6ICVsbGRcbiIsIGNvdW50ZXIpOwp9Cg==