【学习笔记】关于(数学/数论/平面几何)的一切

高精度

加减乘做完了 除法开摆()

void Print(int *a)
{
    bool flag=0;
    int i=M;
    while(!a[i] && i) i--;
    while(i) {putchar(a[i]^48);i--;flag=1;}
    if(!flag) putchar(0^48);
}

stack<int> stk;
void Read(int *a)
{
    for(int i=1;i<=N;i++) a[i]=0;
    char ch=getchar();
    while(~ch && !isdigit(ch)) ch=getchar();
    while(~ch && isdigit(ch))
    {
        stk.push(ch^48);
        ch=getchar();
    }
    int i=1;
    while(!stk.empty())
    {
        a[i]=stk.top();
        i++;
        stk.pop();
    }
}

int Compare(int *a,int *b)
{
    for(int i=N;i>=1;i--) 
    {
        if(a[i]<b[i]) return 0;
        if(a[i]>b[i]) return 1;
    }
    return 2;
}

void Add(int *a,int *b,int *c)
{
    for(int i=1;i<=N;i++)
    {
        c[i]+=a[i]+b[i];
        c[i+1]+=c[i]/10;
        c[i]=c[i]%10;
    }
}

void Minus(int *a,int *b,int *c)
{
    for(int i=1;i<=N;i++)
    {
        c[i]+=a[i]-b[i];
        if(c[i]<0) c[i]+=10,c[i+1]-=1;
    }
}

void Multiply(int *a,int *b,int *c)
{
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            c[i+j-1]+=a[i]*b[j];
        }
    }
    for(int i=1;i<=M;i++) 
    {
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
}

快速幂

人话

\(a\)\(n\)次方,其实就是根据二进制唯一分解定理\(a^n\)拆成\(\log{n}\)\(a^{2^i}\),递推求出从\(a^0\)\(a^{2^i}\)每个数,如果\(n\)的二进制第\(i\)位为1,则将答案乘上\(a^{2^i}\)

ll Qpow(ll a,ll b)
{
    //一开始a就是a的一次方
    ll ans=1;
    while(b) //只要还没乘完
    {
        if(b&1) ans=ans*a%p;//拆分过后这一位是1,所以乘上2的x次方
        a=a*a%p; //a变为a的二次方,四次方,八次方,十六次方....
        b=b>>1;  //非常好理解,这一位算完了,直接右移掉
    }
    return ans%p;
}

高精度加法

线性基

性质

我们设原集合为\(S\),线性基集合为\(P\)
1.S中任意元素可以用P中的一些数异或和表示(表示方法唯一)
2.线性基任意数异或和不为0(与第一条括号内等价)

code

posted @ 2024-02-22 09:49  yeyou26  阅读(28)  评论(2编辑  收藏  举报