大数开根号

#include
typedef long long ll;
const int K=3,N=40003/K,M=pow(10,K),p=998244353,g=3,gi=332748118;
int m,i,l,r,L,lim,re[N],f[11],a[N],b[N],inv;
char s[10003];
struct NUM{
    int t,a[N];
}x,A;
inline int pls(int x,int y){x+=y;return x>=p?x-p:x;}
inline int dec(int x,int y){x-=y;return x<0?x+p:x;}
inline int mul(int x,int y){return (ll)x*y%p;}
inline int pow(int x,int y){
    int ans=1;
    for (;y;y>>=1,x=mul(x,x))
        if (y&1) ans=mul(ans,x);
    return ans;
}
inline void ntt(int *A,int opt){
    for (int i=0;i>1;
    for (int mid=1;mid>=1){
        int wn=pow((opt==1)?g:gi,pp);
        for (int R=mid<<1,j=0;j>1]>>1)|((i&1)<<(L-1));
    for (int i=x.t-t1;i>=1,x=mul(x,x,t1,t1),t1<<=1)
        if (y&1) z=mul(z,x,t2,t1),t2+=t1;
    return z;
}
inline bool operator >=(NUM x,NUM y){
    if (x.t!=y.t) return x.t>y.t;
    for (int i=x.t-1;i>=0;i--)
        if (x.a[i]!=y.a[i]) return x.a[i]>y.a[i];
    return 1;
}
inline void print(NUM x){
    for (int i=x.t-1;i>=0;i--){
        if (i=0;i--) A.a[(A.t-1-i)/K]+=(s[i]^48)*f[(A.t-1-i)%K];
    A.t=((A.t-1)/K)+1;
    x.t=(A.t-1)/m+1;
    for (i=x.t-1;i>=0;i--){
        l=0;r=M-1;
        while (l>1;
            if (A>=pow(x,m,i)) l=x.a[i];
            else r=x.a[i]-1;
        }
        x.a[i]=l;
    }
    print(x);
}

可以当板子用,精度还是挺高的

你可能感兴趣的:(数学+数论)