高精度Operator用法及压位
看到一道BZOJ1089,有高精度各种操作,可以当高精度模板了
#include<cstdio>
#define rad 10000//压位
using namespace std;
int n,d,i,now;
struct data{int v[2005],l;}f[30];//v为值,l为长度
void print(data a){printf("%d",a.v[a.l]);for(i=a.l-1;i;i--)printf("%04d",a.v[i]);}
data operator*(data a,data b){//高精度乘法
data c;
for(int i=1;i<=a.l+b.l;i++)c.v[i]=0;
for(int i=1;i<=a.l;i++)
for(int j=1;j<=b.l;j++)
c.v[i+j-1]+=a.v[i]*b.v[j];
c.l=a.l+b.l-1;
for(int i=1;i<=c.l;i++){
c.v[i+1]+=c.v[i]/rad;
c.v[i]%=rad;
}
if(c.v[c.l+1])c.l++;
return c;
}
data operator^(data a,int p){//高精度求快速幂
data c;
c.l=1;c.v[1]=1;
for(;p;p>>=1,a=a*a)if(p&1)c=c*a;
return c;
}
data operator-(data a,data b){//高精度减高精度
for(int i=1;i<=a.l;i++){
a.v[i]-=b.v[i];
if(a.v[i]<0){
a.v[i]+=rad;
a.v[i+1]--;
}
}
while(a.l>1&&!a.v[a.l])a.l--;
return a;
}
data operator+(data a,int p){//高精度加单精度
a.v[1]+=p;
int now=1;
while(a.v[now]>=rad){
a.v[now+1]+=a.v[now]/rad;
a.v[now]%=rad;
now++;
}
if(now>a.l)a.l=now;
return a;
}
int main(){
scanf("%d%d",&n,&d);
if(!d){puts("1");return 0;}
f[0].l=f[0].v[1]=1;
for(i=1;i<=d;i++)f[i]=(f[i-1]^n)+1;
print(f[d]-f[d-1]);
}
2015年5月16日 14:09
然而你这个高精度连负数都不兹磁
2015年5月16日 14:11
而且还不兹磁高精度加高精度和高精度除法,而且高精度乘法还是暴力实现的。。。
2015年5月16日 18:24
胡主力您是很强嘛