高精度板子
#pragma GCC optimize("O2") #include<iostream> #include<cstdio> #include<cstdlib> #include<bitset> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<vector> #include<stack> #include<set> #include<map> #include<limits.h> #include<ctime> #define N 100001 typedef long long ll; const int inf=0x3fffffff; const int maxn=2017; const int mod=1000000007; using namespace std; inline int read() { int f=1,x=0;char ch=getchar(); while(ch>'9'||ch<'0') { if(ch=='-') f=-1; ch=getchar(); } while(ch<='9'&&ch>='0') { x=(x<<3)+(x<<1)+ch-'0'; ch=getchar(); } return f*x; } struct bnum { short a[N]; int size; bnum() { memset(a,0,sizeof a); size=1; } bnum(ll k) { *this=k; } bnum operator =(ll k) { char ch[1000]; sprintf(ch,"%lld",k); size=strlen(ch); for(int i=0;i<size;i++) a[i]=ch[size-i-1]-'0'; return *this; } bool operator <(bnum b) { if(size==b.size) { for(int i=size-1;i>=0;i--) { if(a[i]<b.a[i])return 1; if(a[i]>b.a[i])return 0; } return 0; } else return size<b.size; } bool operator >=(bnum b) { return !(*this<b); } bool operator >(bnum b) { return b<*this; } bool operator ==(bnum b) { return (!(*this<b)&&(!(b<*this))); } bnum operator +(bnum b) { bnum c; int lena=size,lenb=b.size; c.size=max(lena,lenb)+1; for(int i=0;i<c.size+1;i++) { c.a[i]+=a[i]+b.a[i]; if(c.a[i]>=10) c.a[i]-=10,c.a[i+1]++; } if(!c.a[c.size-1]&&c.size>1) c.size--; return c; } bnum operator -(bnum b) { bnum c; int lena=size,lenb=b.size; c.size=max(lena,lenb); for(int i=0;i<c.size;i++) { c.a[i]+=a[i]-b.a[i]; if(c.a[i]<0) c.a[i]+=10,c.a[i+1]--; } while(!c.a[c.size-1]&&c.size>1)c.size--; return c; } bnum operator /(bnum b) { bnum c,d,q=*this; c.size=size-b.size+1; for(int i=c.size-1;i>=0;i--) { d.clear(); d=b.numcpy(i+1); while(q>=d) {c.a[i]++;q=q-d;} } while(!c.a[c.size-1]&&c.size>0)c.size--; return c; } bnum operator %(bnum b) { bnum c,d,q=*this; c.size=size-b.size+1; for(int i=c.size-1;i>=0;i--) { d.clear(); d=b.numcpy(i+1); while(q>=d) {c.a[i]++;q=q-d;} } return q; } private: void clear() { memset(a,0,sizeof a); size=1; } bnum numcpy(int k) { bnum c; for(int i=0;i<size;i++) c.a[i+k-1]=a[i]; c.size=size+k-1; return c; } }; ostream& operator <<(ostream &os,bnum x) { for(int i=x.size-1;i>=0;i--) printf("%d",x.a[i]); return os; } istream& operator >>(istream &is,bnum &x) { char ch[N]; scanf("%s",ch); x.size=strlen(ch); for(int i=0;i<x.size;i++) { x.a[i]=ch[x.size-i-1]-'0'; } return is; } ll qpow(ll a,ll b) { ll res=1; while(b) { if(b&1) res=res*a; a=a*a; b>>=1; } return res; } ll cpy(bnum b) { ll res=0; for(int i=0;i<b.size;i++) res+=qpow(10,i)*b.a[i]; return res; }
就让我永远不在这里写下什么有意义的话——by 吉林神犇 alone_wolf