一些函数要记的函数笔记

__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,yd);
}
double dot (P p) { //向量积
return add(x
p.x,yp.y);
}
double det(P p) { //数量积
return add(x
p.y,-y*p.x);
}
};

double Distance(P a,P b)
{
return sqrt((a.x-b.x)(a.x-b.x)+(a.y-b.y)(a.y-b.y));
}
double InterArea(P a,double R,P b,double r)
{
if(R=R+r) //两圆相离,相交面积为0
return 0;
if(dis<=R-r) //两圆内含,相交面积为小圆的面积
return PIrr;
//两圆相交时
double angle1=acos((RR+disdis-rr)/(2.0Rdis)); //大圆的那个角
double angle2=acos((r
r+disdis-RR)/(2.0rdis)); //小圆的那个角
double s=Rangle1R+rangle2r;
s-=Rdissin(angle1);
return s;
}

  • 全排列 一定要排序 #include
    using namespace std;
    typedef long long ll;
    const int maxn=4e5+5;
    int n[maxn];
    int dp[maxn][9];
    int main() {
    int ans[9]= {0,1,2,3,4,5,6,7,8};
    int k=0;
    do {
    for(int i=0; i<9; i++) {
    dp[k][i]=ans[i];
    }
    k++;
    } while(next_permutation(ans,ans+9));
    return 0;
    }

hypot() 求三角斜边