__builtin_popcount() 求二进制 1的个数。
double add(double a,double b) {
if(abs(a+b)<eps *(abs(a)+abs(b))) return 0;
return a+b;
}
一个 向量操作结构体。
const double eps =1e-8;
struct P {
double x,y;
P() {}
P(double x,double y):x(x),y(y) {}
P operator + (P p) {
return P(add(x,p.x),add(y,p.y));
}
P operator - (P p) {
return P(add(x,-p.x),add(y,-p.y));
}
P operator * (double d) {
return P(x*d,y*d);
}
double dot (P p) { //向量积
return add(x*p.x,y*p.y);
}
double det(P p) { //数量积
return add(x*p.y,-y*p.x);
}
};