common.c (731B)
1 #include "common.h" 2 3 void read_data(stack_u64 *times, stack_u64 *distances, char **lines, 4 size_t nlines) { 5 char *cp = lines[0]; 6 uint64_t t; 7 8 while ((cp = sread_next_u64(&t, cp)) != NULL) { 9 stack_u64_push(times, t); 10 } 11 12 cp = lines[1]; 13 while ((cp = sread_next_u64(&t, cp)) != NULL) { 14 stack_u64_push(distances, t); 15 } 16 } 17 18 uint64_t counter(uint64_t t, uint64_t d) { 19 if (t * t < 4 * d) 20 return 0; 21 22 uint64_t r = t * t - 4 * d; 23 long double rr = sqrtl((long double)r); 24 25 uint64_t lb = (uint64_t)floorl(((long double)t - rr) / 2); 26 uint64_t ub = (uint64_t)ceill(((long double)t + rr) / 2); 27 28 while (lb * (t - lb) <= d) 29 lb++; 30 31 while (ub * (t - ub) <= d) 32 ub--; 33 34 return ub - lb + 1; 35 }