| 2 | void init_is_square() { |
| 3 | rep(i,0,64) M |= 1ULL << (63-(i*i)%64); } |
| 4 | inline bool is_square(ll x) { |
| 5 | if (x == 0) return true; // XXX |
| 6 | if ((M << x) >= 0) return false; |
| 7 | int c = __builtin_ctz(x); |
| 8 | if (c & 1) return false; |
| 9 | x >>= c; |
| 10 | if ((x&7) - 1) return false; |
| 11 | ll r = sqrt(x); |
| 12 | return r*r == x; } |
| 13 | // vim: cc=60 ts=2 sts=2 sw=2: |