P1255

HighPerformanceRobot

2019-02-13 17:51:21

Solution

-------------------------------- 好奇为什么难度是普及-,,,这种"高精+n"不是至少应该普及的吗.. -----------------------------------吐槽分割线------------------------- 今天我给大家带来了高精模板,大家随便借鉴哈,顺便推广一下本人的自己写的头文件: 更全的高精模板?从SHORT到LONG_LONG? 更多的函数?~~(好吧其实很少)~~ 敬请关注:[我的blog !](https://ymxismylove.blog.luogu.org/stdafxh-v10-post) ------------ 思路很简单,模拟过程罢了. 上代码: ```cpp #include<bits/stdc++.h> //#include<stdafx> using namespace std; class LONG_LONG { protected: int number[10240]; int len; bool flag; public: LONG_LONG() { fill(number,number+10240,0); len=1,flag=1; } LONG_LONG(int num) { *this=num; } LONG_LONG(char* num) { *this=num; } void count() { while(len>1&&!number[len-1]) len--; } LONG_LONG operator=(const char* num) { fill(number,number+10240,0); char now[10240]=""; if(num[0]!='-') strcpy(now,num); else for(int i=1,lon=strlen(num); i<lon; i++) now[i-1]=num[i]; flag=!(num[0]=='-'); len=strlen(now); for(int i=0; i<len; i++) number[i]=now[len-i-1]-'0'; return *this; } LONG_LONG operator=(int num) { num<0?flag=0,num=-num:flag=1; char temp[10241]; sprintf(temp,"%d",num); *this=temp; return *this; } LONG_LONG operator=(const string num) { const char* temp; temp=num.c_str(); *this=temp; return *this; } LONG_LONG operator+(const LONG_LONG& num)const { if(flag^num.flag) { LONG_LONG tmp=flag?num:*this; tmp.flag=1; return flag?*this-tmp:num-tmp; } LONG_LONG res; res.len=0; for(int i=0,temp=0; temp||i<(max(len,num.len)); i++) { int t=number[i]+num.number[i]+temp; res.number[res.len++]=t%10; temp=t/10; } res.flag=flag; return res; } LONG_LONG operator-(const LONG_LONG& num)const { LONG_LONG nowb=num,nowa=*this; if(!num.flag&&!flag) { nowb.flag=nowa.flag=1; return nowb-nowa; } if(!nowb.flag) { nowb.flag=1; return nowa+nowb; } if(!nowa.flag) { nowa.flag=1; nowb=LONG_LONG(0)-(nowa+nowb); return nowb; } if(nowa<nowb) { LONG_LONG nowc=(nowb-nowa); nowc.flag=false; return nowc; } LONG_LONG res; res.len=0; for(int i=0,g=0; i<nowa.len; i++) { int now=nowa.number[i]-g; if(i<nowb.len) now-=nowb.number[i]; now>=0?g=0:g=1,now+=10; res.number[res.len++]=now; } res.count(); return res; } LONG_LONG operator*(const int& num)const { LONG_LONG nowa=num,nowb=*this; return nowa*nowb; } LONG_LONG operator*(const LONG_LONG& num)const { LONG_LONG res; res.len=len+num.len; for(int i=0; i<len; i++) for(int j=0; j<num.len; j++) res.number[i+j]+=number[i]*num.number[j]; for(int i=0; i<res.len; i++) { res.number[i+1]+=res.number[i]/10; res.number[i]%=10; } res.count(); res.flag=!(flag^num.flag); return res; } LONG_LONG operator/(const LONG_LONG& num)const { LONG_LONG res; res.len=len-num.len+1; if(res.len<0) { res.len=1; return res; } LONG_LONG div_1=*this,div_2=num; div_1.flag=div_2.flag=1; int nowflag=res.len-1,nowflag2=len-1; while(nowflag>=0) { while(div_1.number[nowflag2]==0) nowflag2--; if(nowflag>nowflag2) nowflag=nowflag2; char z[10241]; fill(z,z+10241,0); for(int i=nowflag2; i>=nowflag; i--) z[nowflag2-i]=div_1.number[i]+'0'; LONG_LONG div_3=z; if(div_3<div_2) { nowflag--; continue; } int key=0; while(div_2*key<=div_3) key++; key--; res.number[nowflag]=key; LONG_LONG temp=div_2*key; for(int i=0; i<nowflag; i++) temp=temp*10; div_1=div_1-temp; nowflag--; } res.count(); res.flag=!(flag^num.flag); return res; } LONG_LONG operator%(const LONG_LONG& num)const { LONG_LONG nowa=*this,nowb=num; nowa.flag=nowb.flag=1; LONG_LONG res,temp=nowa/nowb*nowb; res=nowa-temp; res.flag=flag; return res; } LONG_LONG operator+=(const LONG_LONG& num) { *this=*this+num; return *this; } LONG_LONG operator-=(const LONG_LONG& num) { *this=*this-num; return *this; } LONG_LONG operator*=(const LONG_LONG& num) { *this=*this*num; return *this; } LONG_LONG operator/=(const LONG_LONG& num) { *this=*this/num; return *this; } LONG_LONG operator++() { *this=*this+1; return *this; } LONG_LONG operator++(int) { LONG_LONG old=*this; ++(*this); return old; } LONG_LONG operator--() { *this=*this-1; return *this; } LONG_LONG operator--(int) { LONG_LONG old=*this; --(*this); return old; } bool operator<(const LONG_LONG& num)const { if(flag^num.flag) return num.flag; if(len!=num.len) return len<num.len; for(int i=len-1; i>=0; i--) if(number[i]!=num.number[i]) return flag?(number[i]<num.number[i]):(!(number[i]<num.number[i])); return !flag; } bool operator>(const LONG_LONG& num)const { return num<*this; } bool operator<=(const LONG_LONG& num)const { return !(*this>num); } bool operator>=(const LONG_LONG& num)const { return !(*this<num); } bool operator==(const LONG_LONG& num)const { return !(num!=*this); } bool operator!=(const LONG_LONG& num)const { return *this>num||*this<num; } bool operator!()const { return *this==1?0:1; } string str()const { string res=""; for(int i=0; i<len; i++) res=static_cast<char>(number[i]+'0')+res; if(res=="") res="0"; if(!flag&&res!="0") res="-"+res; return res; } }; istream& operator>>(istream &in,LONG_LONG &f) { string s; in>>s; f=s.c_str(); return in; } ostream& operator<<(ostream &out,const LONG_LONG &f) { out<<f.str(); return out; } LONG_LONG a=1,b=1,c,n; int main() { ios::sync_with_stdio(0); cin.tie(0); cin>>n; if(n==0) { cout<<0<<endl; return 0; } for(LONG_LONG i=1; i<n; i++) { c=b; b+=a; a=c; } cout<<b<<endl; return 0; } ```