#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
double getTime(){
struct timeval tv;
gettimeofday(&tv, 0);
return tv.tv_sec + tv.tv_usec * 1e-6;
};
int main (void) {
double stime=getTime();
int64_t c, r, x, y, aux;
c=0;
aux=0;
r = 968790360;
//calcular r*r para ser mais rápido, sr ponto de partida dos x, e last é o maior y tal que (x-1)*(x-1) + y*y <= r
//last = r/sqrt(2) porque sqrt(r*r - r/sqrt(2)) = r/sqrt(2)
int64_t r2
=r
*r
,sr
=r
/sqrt(2) + 1,last
=sr
-1; for(x=sr;x<=r;x++) {
y
=sqrt(r2
- x
*x
); //calcula maior y tal que x*x + y*y <= r c+=2*y+1; //soma 1 por cada ponto (x',y') x'=x, -y <= y' <= y
c+=(last-y)*(2*(x-1)+1); // soma 1 por cada ponto (x',y'), y < x' <= last, -(x-1) <= y' <= x-1
last=y;
}
c=2*c+2*r+1; //c=2*c porque apenas tivemos em conta os pontos x>0, +2*r+1 porque x=0 dá -r <= y' <= r
printf("%lld\n%lf\n",c
,getTime
()-stime
); c = (c * 0x671659AD2B395A35LLU) ^ 0x6A657B39259F7846LLU;
printf("send solution and cv to: %.8s@grupopie.com\n", (char *) &c
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8dGltZS5oPgoKZG91YmxlIGdldFRpbWUoKXsKICAgc3RydWN0IHRpbWV2YWwgdHY7IAogICBnZXR0aW1lb2ZkYXkoJnR2LCAwKTsgCiAgIHJldHVybiB0di50dl9zZWMgKyB0di50dl91c2VjICogMWUtNjsKfTsKCmludCBtYWluICh2b2lkKSB7CmRvdWJsZSBzdGltZT1nZXRUaW1lKCk7CmludDY0X3QgYywgciwgeCwgeSwgYXV4OwpjPTA7CmF1eD0wOwpyID0gOTY4NzkwMzYwOwovL2NhbGN1bGFyIHIqciBwYXJhIHNlciBtYWlzIHLDoXBpZG8sIHNyIHBvbnRvIGRlIHBhcnRpZGEgZG9zIHgsIGUgbGFzdCDDqSBvIG1haW9yIHkgdGFsIHF1ZSAoeC0xKSooeC0xKSArIHkqeSA8PSByCi8vbGFzdCA9IHIvc3FydCgyKSBwb3JxdWUgc3FydChyKnIgLSByL3NxcnQoMikpID0gci9zcXJ0KDIpCmludDY0X3QgcjI9cipyLHNyPXIvc3FydCgyKSArIDEsbGFzdD1zci0xOwpmb3IoeD1zcjt4PD1yO3grKykgewoJCXk9c3FydChyMiAtIHgqeCk7IC8vY2FsY3VsYSBtYWlvciB5IHRhbCBxdWUgeCp4ICsgeSp5IDw9IHIKCQljKz0yKnkrMTsgLy9zb21hIDEgcG9yIGNhZGEgcG9udG8gKHgnLHknKSAgeCc9eCwgLXkgPD0geScgPD0geQogICAgICAgICAgICAgICAgYys9KGxhc3QteSkqKDIqKHgtMSkrMSk7IC8vIHNvbWEgMSBwb3IgY2FkYSBwb250byAoeCcseScpLCB5IDwgeCcgPD0gbGFzdCwgLSh4LTEpIDw9IHknIDw9IHgtMQoJCWxhc3Q9eTsJCQp9CmM9MipjKzIqcisxOyAvL2M9MipjIHBvcnF1ZSBhcGVuYXMgdGl2ZW1vcyBlbSBjb250YSBvcyBwb250b3MgeD4wLCArMipyKzEgcG9ycXVlIHg9MCBkw6EgLXIgPD0geScgPD0gcgpwcmludGYoIiVsbGRcbiVsZlxuIixjLGdldFRpbWUoKS1zdGltZSk7CmMgPSAoYyAqIDB4NjcxNjU5QUQyQjM5NUEzNUxMVSkgXiAweDZBNjU3QjM5MjU5Rjc4NDZMTFU7IAogcHJpbnRmKCJzZW5kIHNvbHV0aW9uIGFuZCBjdiB0bzogJS44c0BncnVwb3BpZS5jb21cbiIsIChjaGFyICopICZjKTsKcmV0dXJuIDA7Cn0=